summaryrefslogtreecommitdiffstats
path: root/clang
diff options
context:
space:
mode:
authorRichard Smith <richard-llvm@metafoo.co.uk>2014-01-24 01:54:52 +0000
committerRichard Smith <richard-llvm@metafoo.co.uk>2014-01-24 01:54:52 +0000
commit7ff2bcb81424a6f9cded249b14b817ea25c37dcc (patch)
tree4e9146aa9708e67d4caa78f3d1e1d876fe2b3932 /clang
parent3e92a2b013c320ed2b2f6fc183a023fb3b657869 (diff)
downloadbcm5719-llvm-7ff2bcb81424a6f9cded249b14b817ea25c37dcc.tar.gz
bcm5719-llvm-7ff2bcb81424a6f9cded249b14b817ea25c37dcc.zip
PR18560: When switching to a new context, don't just save and restore an
override for the type of 'this', also clear it out (unless we're entering the context of a lambda-expression, where it should be inherited). llvm-svn: 199962
Diffstat (limited to 'clang')
-rw-r--r--clang/include/clang/Sema/Sema.h4
-rw-r--r--clang/lib/Sema/TreeTransform.h3
-rw-r--r--clang/test/SemaCXX/member-init.cpp10
3 files changed, 15 insertions, 2 deletions
diff --git a/clang/include/clang/Sema/Sema.h b/clang/include/clang/Sema/Sema.h
index f11cb9ca93a..12a4116f01f 100644
--- a/clang/include/clang/Sema/Sema.h
+++ b/clang/include/clang/Sema/Sema.h
@@ -479,13 +479,15 @@ public:
QualType SavedCXXThisTypeOverride;
public:
- ContextRAII(Sema &S, DeclContext *ContextToPush)
+ ContextRAII(Sema &S, DeclContext *ContextToPush, bool NewThisContext = true)
: S(S), SavedContext(S.CurContext),
SavedContextState(S.DelayedDiagnostics.pushUndelayed()),
SavedCXXThisTypeOverride(S.CXXThisTypeOverride)
{
assert(ContextToPush && "pushing null context");
S.CurContext = ContextToPush;
+ if (NewThisContext)
+ S.CXXThisTypeOverride = QualType();
}
void pop() {
diff --git a/clang/lib/Sema/TreeTransform.h b/clang/lib/Sema/TreeTransform.h
index 787581d35be..27380f8c8d4 100644
--- a/clang/lib/Sema/TreeTransform.h
+++ b/clang/lib/Sema/TreeTransform.h
@@ -8339,7 +8339,8 @@ TreeTransform<Derived>::TransformLambdaScope(LambdaExpr *E,
bool Invalid = false;
// Introduce the context of the call operator.
- Sema::ContextRAII SavedContext(getSema(), CallOperator);
+ Sema::ContextRAII SavedContext(getSema(), CallOperator,
+ /*NewThisContext*/false);
LambdaScopeInfo *const LSI = getSema().getCurLambda();
// Enter the scope of the lambda.
diff --git a/clang/test/SemaCXX/member-init.cpp b/clang/test/SemaCXX/member-init.cpp
index 6e4fd5df5a0..d8a00b3b1e2 100644
--- a/clang/test/SemaCXX/member-init.cpp
+++ b/clang/test/SemaCXX/member-init.cpp
@@ -100,3 +100,13 @@ namespace rdar14084171 {
};
void f(Sprite& x) { x = x; }
}
+
+namespace PR18560 {
+ struct X { int m; };
+
+ template<typename T = X,
+ typename U = decltype(T::m)>
+ int f();
+
+ struct Y { int b = f(); };
+}
OpenPOWER on IntegriCloud