diff --git a/clang/lib/Sema/SemaConcept.cpp b/clang/lib/Sema/SemaConcept.cpp index 2f5fb8f8d029e..25884838d632c 100644 --- a/clang/lib/Sema/SemaConcept.cpp +++ b/clang/lib/Sema/SemaConcept.cpp @@ -764,6 +764,15 @@ static const Expr *SubstituteConstraintExpression(Sema &S, const NamedDecl *ND, return ConstrExpr; Sema::SFINAETrap SFINAE(S, /*AccessCheckingSFINAE=*/false); + + Sema::InstantiatingTemplate Inst( + S, ND->getLocation(), + Sema::InstantiatingTemplate::ConstraintNormalization{}, + const_cast(ND), SourceRange{}); + + if (Inst.isInvalid()) + return nullptr; + std::optional ThisScope; if (auto *RD = dyn_cast(ND->getDeclContext())) ThisScope.emplace(S, const_cast(RD), Qualifiers()); diff --git a/clang/test/SemaTemplate/concepts-out-of-line-def.cpp b/clang/test/SemaTemplate/concepts-out-of-line-def.cpp index b7c91712f8713..25b34f0644a17 100644 --- a/clang/test/SemaTemplate/concepts-out-of-line-def.cpp +++ b/clang/test/SemaTemplate/concepts-out-of-line-def.cpp @@ -399,3 +399,16 @@ inline void W0::W1::f(const T9 &) {} } // namespace three_level } // namespace MultilevelTemplateWithPartialSpecialization + +namespace PR62697 { +template +concept c = true; + +template +struct s { + void f() requires c; +}; + +template +void s::f() requires c { } +}