diff options
author | Younan Zhang <zyn7109@gmail.com> | 2025-07-18 15:23:32 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-07-18 15:23:32 +0800 |
commit | beec840822867079b829f35cbd4b360aa8971438 (patch) | |
tree | cd895b549cf3e4171e8eee3921093a45301cb5d3 /clang/lib/Sema/SemaConcept.cpp | |
parent | 5bac67d9213da8afa0e35199395774ca3c7daa39 (diff) | |
download | llvm-beec840822867079b829f35cbd4b360aa8971438.zip llvm-beec840822867079b829f35cbd4b360aa8971438.tar.gz llvm-beec840822867079b829f35cbd4b360aa8971438.tar.bz2 |
[Clang] Ensure correct parameters are in the scope for constraint equivalence checking (#149264)
This is another case where untransformed constraint expressions led to
inconsistent transforms.
We did fix some of those issues by looking at parent scopes, however the
parent instantiation scope is not always available because we could also
reach here after the parents get instantiated.
Fixes #146614
Diffstat (limited to 'clang/lib/Sema/SemaConcept.cpp')
-rw-r--r-- | clang/lib/Sema/SemaConcept.cpp | 5 |
1 files changed, 5 insertions, 0 deletions
diff --git a/clang/lib/Sema/SemaConcept.cpp b/clang/lib/Sema/SemaConcept.cpp index 834417f..5205ca0b 100644 --- a/clang/lib/Sema/SemaConcept.cpp +++ b/clang/lib/Sema/SemaConcept.cpp @@ -925,7 +925,12 @@ static const Expr *SubstituteConstraintExpressionWithoutSatisfaction( ND && ND->isFunctionOrFunctionTemplate()) { ScopeForParameters.emplace(S, /*CombineWithOuterScope=*/true); const FunctionDecl *FD = ND->getAsFunction(); + if (FunctionTemplateDecl *Template = FD->getDescribedFunctionTemplate(); + Template && Template->getInstantiatedFromMemberTemplate()) + FD = Template->getInstantiatedFromMemberTemplate()->getTemplatedDecl(); for (auto *PVD : FD->parameters()) { + if (ScopeForParameters->getInstantiationOfIfExists(PVD)) + continue; if (!PVD->isParameterPack()) { ScopeForParameters->InstantiatedLocal(PVD, PVD); continue; |