https://github.com/wx257osn2 updated https://github.com/llvm/llvm-project/pull/184406
>From 2a6f2f9184e45cbedb0758d053c9bc573d1478aa Mon Sep 17 00:00:00 2001 From: I <[email protected]> Date: Tue, 3 Mar 2026 21:39:30 +0900 Subject: [PATCH 1/7] add test --- .../SemaCXX/cxx2c-template-template-param.cpp | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/clang/test/SemaCXX/cxx2c-template-template-param.cpp b/clang/test/SemaCXX/cxx2c-template-template-param.cpp index 704df3112277f..6ba18a253d34c 100644 --- a/clang/test/SemaCXX/cxx2c-template-template-param.cpp +++ b/clang/test/SemaCXX/cxx2c-template-template-param.cpp @@ -432,5 +432,21 @@ template <typename T, template <typename...> concept C1> concept TestBinary = T::a || C1<T>; static_assert(TestBinary<int, A>); +} + +namespace concept_template_parameter_as_second_parameter { + +template <typename> +concept Any = true; + +template <typename T, template <typename...> concept C> +concept Wrap = C<T>; + +template <typename T, Wrap<Any> U> +void f(T&&, U&&) {} + +void test() { + f(0, 1); +} } >From 554457662fdc3a24b2d929ff82294fc376145c17 Mon Sep 17 00:00:00 2001 From: I <[email protected]> Date: Tue, 3 Mar 2026 22:33:43 +0900 Subject: [PATCH 2/7] early return --- clang/lib/Sema/SemaTemplateInstantiate.cpp | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/clang/lib/Sema/SemaTemplateInstantiate.cpp b/clang/lib/Sema/SemaTemplateInstantiate.cpp index b4d8158525f04..32b406b551247 100644 --- a/clang/lib/Sema/SemaTemplateInstantiate.cpp +++ b/clang/lib/Sema/SemaTemplateInstantiate.cpp @@ -4481,11 +4481,10 @@ ExprResult Sema::SubstConceptTemplateArguments( ExprResult TransformUnresolvedLookupExpr(UnresolvedLookupExpr *E, bool IsAddressOfOperand = false) { - if (E->isConceptReference()) { - ExprResult Res = SemaRef.SubstExpr(E, MLTAL); - return Res; - } - return E; + if (!E->isConceptReference()) + return E; + + return SemaRef.SubstExpr(E, MLTAL); } }; >From a4be99ae34ed291563005892a6466e6859488c56 Mon Sep 17 00:00:00 2001 From: I <[email protected]> Date: Wed, 4 Mar 2026 00:17:20 +0900 Subject: [PATCH 3/7] resolve concept with correct template id --- clang/lib/Sema/SemaTemplateInstantiate.cpp | 31 +++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/clang/lib/Sema/SemaTemplateInstantiate.cpp b/clang/lib/Sema/SemaTemplateInstantiate.cpp index 32b406b551247..5015c6d4a460a 100644 --- a/clang/lib/Sema/SemaTemplateInstantiate.cpp +++ b/clang/lib/Sema/SemaTemplateInstantiate.cpp @@ -4484,7 +4484,36 @@ ExprResult Sema::SubstConceptTemplateArguments( if (!E->isConceptReference()) return E; - return SemaRef.SubstExpr(E, MLTAL); + NamedDecl *D = *E->decls_begin(); + ConceptDecl *ResolvedConcept = nullptr; + + if (const auto * const TTP = dyn_cast<TemplateTemplateParmDecl>(D)) { + const auto Depth = TTP->getDepth(); + const auto Pos = TTP->getPosition(); + if (Depth < MLTAL.getNumLevels() && + MLTAL.hasTemplateArgument(Depth, Pos)) { + TemplateArgument Arg = MLTAL(Depth, Pos); + if (Arg.getKind() == TemplateArgument::Template) + ResolvedConcept = dyn_cast_or_null<ConceptDecl>( + Arg.getAsTemplate().getAsTemplateDecl()); + } + } else + ResolvedConcept = dyn_cast<ConceptDecl>(D); + + if (ResolvedConcept == nullptr) + return E; + + TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc()); + if (TransformTemplateArguments(E->getTemplateArgs(), + E->getNumTemplateArgs(), TransArgs)) + return ExprError(); + + CXXScopeSpec SS; + DeclarationNameInfo NameInfo(ResolvedConcept->getDeclName(), + E->getNameLoc()); + return SemaRef.CheckConceptTemplateId(SS, SourceLocation(), NameInfo, + ResolvedConcept, ResolvedConcept, + &TransArgs, false); } }; >From ec1a8d3767d8cab315b46b6b6695345a44676506 Mon Sep 17 00:00:00 2001 From: I <[email protected]> Date: Thu, 5 Mar 2026 00:58:46 +0900 Subject: [PATCH 4/7] remove const --- clang/lib/Sema/SemaTemplateInstantiate.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clang/lib/Sema/SemaTemplateInstantiate.cpp b/clang/lib/Sema/SemaTemplateInstantiate.cpp index 5015c6d4a460a..147cbe2974463 100644 --- a/clang/lib/Sema/SemaTemplateInstantiate.cpp +++ b/clang/lib/Sema/SemaTemplateInstantiate.cpp @@ -4487,7 +4487,7 @@ ExprResult Sema::SubstConceptTemplateArguments( NamedDecl *D = *E->decls_begin(); ConceptDecl *ResolvedConcept = nullptr; - if (const auto * const TTP = dyn_cast<TemplateTemplateParmDecl>(D)) { + if (auto *TTP = dyn_cast<TemplateTemplateParmDecl>(D)) { const auto Depth = TTP->getDepth(); const auto Pos = TTP->getPosition(); if (Depth < MLTAL.getNumLevels() && >From 80540cf4906e0c1e24c6c32609346916302ea90b Mon Sep 17 00:00:00 2001 From: I <[email protected]> Date: Thu, 5 Mar 2026 00:59:07 +0900 Subject: [PATCH 5/7] s/const auto/unsigned/ --- clang/lib/Sema/SemaTemplateInstantiate.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/clang/lib/Sema/SemaTemplateInstantiate.cpp b/clang/lib/Sema/SemaTemplateInstantiate.cpp index 147cbe2974463..e94718c20e1da 100644 --- a/clang/lib/Sema/SemaTemplateInstantiate.cpp +++ b/clang/lib/Sema/SemaTemplateInstantiate.cpp @@ -4488,8 +4488,8 @@ ExprResult Sema::SubstConceptTemplateArguments( ConceptDecl *ResolvedConcept = nullptr; if (auto *TTP = dyn_cast<TemplateTemplateParmDecl>(D)) { - const auto Depth = TTP->getDepth(); - const auto Pos = TTP->getPosition(); + unsigned Depth = TTP->getDepth(); + unsigned Pos = TTP->getPosition(); if (Depth < MLTAL.getNumLevels() && MLTAL.hasTemplateArgument(Depth, Pos)) { TemplateArgument Arg = MLTAL(Depth, Pos); >From d0bdc4734568e84b5015ce213e14803088a778a3 Mon Sep 17 00:00:00 2001 From: I <[email protected]> Date: Thu, 5 Mar 2026 01:19:39 +0900 Subject: [PATCH 6/7] use assert instead of if --- clang/lib/Sema/SemaTemplateInstantiate.cpp | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/clang/lib/Sema/SemaTemplateInstantiate.cpp b/clang/lib/Sema/SemaTemplateInstantiate.cpp index e94718c20e1da..feb8684c680d4 100644 --- a/clang/lib/Sema/SemaTemplateInstantiate.cpp +++ b/clang/lib/Sema/SemaTemplateInstantiate.cpp @@ -40,6 +40,7 @@ #include "llvm/Support/ErrorHandling.h" #include "llvm/Support/SaveAndRestore.h" #include "llvm/Support/TimeProfiler.h" +#include <iterator> #include <optional> using namespace clang; @@ -4484,19 +4485,20 @@ ExprResult Sema::SubstConceptTemplateArguments( if (!E->isConceptReference()) return E; + assert(std::next(E->decls_begin()) == E->decls_end() && + "ConceptReference must have single declaration"); NamedDecl *D = *E->decls_begin(); ConceptDecl *ResolvedConcept = nullptr; if (auto *TTP = dyn_cast<TemplateTemplateParmDecl>(D)) { unsigned Depth = TTP->getDepth(); unsigned Pos = TTP->getPosition(); - if (Depth < MLTAL.getNumLevels() && - MLTAL.hasTemplateArgument(Depth, Pos)) { - TemplateArgument Arg = MLTAL(Depth, Pos); - if (Arg.getKind() == TemplateArgument::Template) - ResolvedConcept = dyn_cast_or_null<ConceptDecl>( - Arg.getAsTemplate().getAsTemplateDecl()); - } + assert(Depth < MLTAL.getNumLevels() && + MLTAL.hasTemplateArgument(Depth, Pos)); + TemplateArgument Arg = MLTAL(Depth, Pos); + assert(Arg.getKind() == TemplateArgument::Template); + ResolvedConcept = dyn_cast_or_null<ConceptDecl>( + Arg.getAsTemplate().getAsTemplateDecl()); } else ResolvedConcept = dyn_cast<ConceptDecl>(D); >From 3d3c6507ea296be77a83d31e3d0e5c5aa967e606 Mon Sep 17 00:00:00 2001 From: I <[email protected]> Date: Thu, 5 Mar 2026 01:23:38 +0900 Subject: [PATCH 7/7] move early return into inner branch --- clang/lib/Sema/SemaTemplateInstantiate.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/clang/lib/Sema/SemaTemplateInstantiate.cpp b/clang/lib/Sema/SemaTemplateInstantiate.cpp index feb8684c680d4..ada0ed390419c 100644 --- a/clang/lib/Sema/SemaTemplateInstantiate.cpp +++ b/clang/lib/Sema/SemaTemplateInstantiate.cpp @@ -4499,11 +4499,11 @@ ExprResult Sema::SubstConceptTemplateArguments( assert(Arg.getKind() == TemplateArgument::Template); ResolvedConcept = dyn_cast_or_null<ConceptDecl>( Arg.getAsTemplate().getAsTemplateDecl()); + if (ResolvedConcept == nullptr) + return E; } else ResolvedConcept = dyn_cast<ConceptDecl>(D); - if (ResolvedConcept == nullptr) - return E; TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc()); if (TransformTemplateArguments(E->getTemplateArgs(), _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
