diff options
author | Richard Smith <richard-llvm@metafoo.co.uk> | 2014-01-24 01:54:52 +0000 |
---|---|---|
committer | Richard Smith <richard-llvm@metafoo.co.uk> | 2014-01-24 01:54:52 +0000 |
commit | 7ff2bcb81424a6f9cded249b14b817ea25c37dcc (patch) | |
tree | 4e9146aa9708e67d4caa78f3d1e1d876fe2b3932 | |
parent | 3e92a2b013c320ed2b2f6fc183a023fb3b657869 (diff) | |
download | bcm5719-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
-rw-r--r-- | clang/include/clang/Sema/Sema.h | 4 | ||||
-rw-r--r-- | clang/lib/Sema/TreeTransform.h | 3 | ||||
-rw-r--r-- | clang/test/SemaCXX/member-init.cpp | 10 |
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(); }; +} |