aboutsummaryrefslogtreecommitdiff
path: root/clang/lib/Sema/SemaConcept.cpp
diff options
context:
space:
mode:
authorYounan Zhang <zyn7109@gmail.com>2025-07-18 15:23:32 +0800
committerGitHub <noreply@github.com>2025-07-18 15:23:32 +0800
commitbeec840822867079b829f35cbd4b360aa8971438 (patch)
treecd895b549cf3e4171e8eee3921093a45301cb5d3 /clang/lib/Sema/SemaConcept.cpp
parent5bac67d9213da8afa0e35199395774ca3c7daa39 (diff)
downloadllvm-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.cpp5
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;