diff options
author | Erich Keane <erich.keane@intel.com> | 2023-05-18 09:05:51 -0700 |
---|---|---|
committer | Erich Keane <erich.keane@intel.com> | 2023-05-18 09:07:42 -0700 |
commit | fbd8f8985e36581487371e9ff4ac7d99655b51e7 (patch) | |
tree | 502d763aea716dcd4a1e356362720876d5431f3e | |
parent | 153d9b9371c3adf719cad4307e395692caa752ac (diff) | |
download | llvm-fbd8f8985e36581487371e9ff4ac7d99655b51e7.zip llvm-fbd8f8985e36581487371e9ff4ac7d99655b51e7.tar.gz llvm-fbd8f8985e36581487371e9ff4ac7d99655b51e7.tar.bz2 |
Ensure comparison of constraints creates a code synth context
This is a regression from 6db007a0 that was reported in:
https://github.com/llvm/llvm-project/issues/62697
The assertion was because we require a code synthesis context for the
instantiation of templates, and this reproducer causes a comparison that
doesn't have a parent-template causing one to exists.
This patch fixes it by creating a ConstraintNormalization context.
-rw-r--r-- | clang/lib/Sema/SemaConcept.cpp | 9 | ||||
-rw-r--r-- | clang/test/SemaTemplate/concepts-out-of-line-def.cpp | 13 |
2 files changed, 22 insertions, 0 deletions
diff --git a/clang/lib/Sema/SemaConcept.cpp b/clang/lib/Sema/SemaConcept.cpp index 2f5fb8f..2588483 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<NamedDecl *>(ND), SourceRange{}); + + if (Inst.isInvalid()) + return nullptr; + std::optional<Sema::CXXThisScopeRAII> ThisScope; if (auto *RD = dyn_cast<CXXRecordDecl>(ND->getDeclContext())) ThisScope.emplace(S, const_cast<CXXRecordDecl *>(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 b7c91712..25b34f0 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<T7, 0>::W1<T8>::f(const T9 &) {} } // namespace three_level } // namespace MultilevelTemplateWithPartialSpecialization + +namespace PR62697 { +template<typename> +concept c = true; + +template<typename T> +struct s { + void f() requires c<void(T)>; +}; + +template<typename T> +void s<T>::f() requires c<void(T)> { } +} |