diff --git a/clang/lib/Sema/SemaConcept.cpp b/clang/lib/Sema/SemaConcept.cpp --- a/clang/lib/Sema/SemaConcept.cpp +++ b/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, diff --git a/clang/test/SemaCXX/template-member-alias-constraint.cpp b/clang/test/SemaCXX/template-member-alias-constraint.cpp new file mode 100644 --- /dev/null +++ b/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 + } +};