[PATCH] D128351: [clang] missing outer template levels when checking template constraints
Lancern created this revision. Lancern added reviewers: Richard, smith. Herald added a project: All. Lancern requested review of this revision. Herald added a project: clang. Herald added a subscriber: cfe-commits. When checking constraint satisfaction on template arguments, the outer template levels are not added to MultiLevelTemplateArgumentList. Fix bugs https://github.com/llvm/llvm-project/issues/50845 Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D128351 Files: clang/lib/Sema/SemaConcept.cpp clang/test/Sema/template-member-constraint.cpp Index: clang/test/Sema/template-member-constraint.cpp === --- /dev/null +++ clang/test/Sema/template-member-constraint.cpp @@ -0,0 +1,26 @@ +// RUN: %clang_cc1 %s -std=c++20 -fsyntax-only -verify + +template +concept Foo = true; + +template +struct Bar {}; + +template +struct Baz { + template + using BazBar = Bar; + + using BazBarInt = BazBar; // expected-no-diagnostics +}; + +template +struct contiguous_range { + template +requires(const_range == false) + using basic_iterator = int; + + auto begin() { +return basic_iterator{}; // expected-no-diagnostics + } +}; Index: clang/lib/Sema/SemaConcept.cpp === --- clang/lib/Sema/SemaConcept.cpp +++ clang/lib/Sema/SemaConcept.cpp @@ -293,6 +293,7 @@ MultiLevelTemplateArgumentList MLTAL; MLTAL.addOuterTemplateArguments(TemplateArgs); + MLTAL.addOuterRetainedLevels(Template->getTemplateDepth()); for (const Expr *ConstraintExpr : ConstraintExprs) { if (calculateConstraintSatisfaction(S, Template, TemplateArgs, Index: clang/test/Sema/template-member-constraint.cpp === --- /dev/null +++ clang/test/Sema/template-member-constraint.cpp @@ -0,0 +1,26 @@ +// RUN: %clang_cc1 %s -std=c++20 -fsyntax-only -verify + +template +concept Foo = true; + +template +struct Bar {}; + +template +struct Baz { + template + using BazBar = Bar; + + using BazBarInt = BazBar; // expected-no-diagnostics +}; + +template +struct contiguous_range { + template +requires(const_range == false) + using basic_iterator = int; + + auto begin() { +return basic_iterator{}; // expected-no-diagnostics + } +}; Index: clang/lib/Sema/SemaConcept.cpp === --- clang/lib/Sema/SemaConcept.cpp +++ clang/lib/Sema/SemaConcept.cpp @@ -293,6 +293,7 @@ MultiLevelTemplateArgumentList MLTAL; MLTAL.addOuterTemplateArguments(TemplateArgs); + MLTAL.addOuterRetainedLevels(Template->getTemplateDepth()); for (const Expr *ConstraintExpr : ConstraintExprs) { if (calculateConstraintSatisfaction(S, Template, TemplateArgs, ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D128351: [clang] missing outer template levels when checking template constraints
Lancern updated this revision to Diff 439253. Lancern added a comment. Fix some regression issues Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D128351/new/ https://reviews.llvm.org/D128351 Files: clang/lib/Sema/SemaConcept.cpp clang/test/SemaCXX/template-member-alias-constraint.cpp Index: clang/test/SemaCXX/template-member-alias-constraint.cpp === --- /dev/null +++ clang/test/SemaCXX/template-member-alias-constraint.cpp @@ -0,0 +1,26 @@ +// RUN: %clang_cc1 %s -std=c++20 -fsyntax-only -verify + +template +concept Foo = true; + +template +struct Bar {}; + +template +struct Baz { + template + using BazBar = Bar; + + using BazBarInt = BazBar; // expected-no-diagnostics +}; + +template +struct contiguous_range { + template +requires(const_range == false) + using basic_iterator = int; + + auto begin() { +return basic_iterator{}; // expected-no-diagnostics + } +}; Index: clang/lib/Sema/SemaConcept.cpp === --- clang/lib/Sema/SemaConcept.cpp +++ clang/lib/Sema/SemaConcept.cpp @@ -293,6 +293,10 @@ MultiLevelTemplateArgumentList MLTAL; MLTAL.addOuterTemplateArguments(TemplateArgs); + if (const TypeAliasTemplateDecl *AliasTemplate = + dyn_cast_or_null(Template)) { +MLTAL.addOuterRetainedLevels(AliasTemplate->getTemplateDepth()); + } for (const Expr *ConstraintExpr : ConstraintExprs) { if (calculateConstraintSatisfaction(S, Template, TemplateArgs, Index: clang/test/SemaCXX/template-member-alias-constraint.cpp === --- /dev/null +++ clang/test/SemaCXX/template-member-alias-constraint.cpp @@ -0,0 +1,26 @@ +// RUN: %clang_cc1 %s -std=c++20 -fsyntax-only -verify + +template +concept Foo = true; + +template +struct Bar {}; + +template +struct Baz { + template + using BazBar = Bar; + + using BazBarInt = BazBar; // expected-no-diagnostics +}; + +template +struct contiguous_range { + template +requires(const_range == false) + using basic_iterator = int; + + auto begin() { +return basic_iterator{}; // expected-no-diagnostics + } +}; Index: clang/lib/Sema/SemaConcept.cpp === --- clang/lib/Sema/SemaConcept.cpp +++ clang/lib/Sema/SemaConcept.cpp @@ -293,6 +293,10 @@ MultiLevelTemplateArgumentList MLTAL; MLTAL.addOuterTemplateArguments(TemplateArgs); + if (const TypeAliasTemplateDecl *AliasTemplate = + dyn_cast_or_null(Template)) { +MLTAL.addOuterRetainedLevels(AliasTemplate->getTemplateDepth()); + } for (const Expr *ConstraintExpr : ConstraintExprs) { if (calculateConstraintSatisfaction(S, Template, TemplateArgs, ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits