From 7ff2bcb81424a6f9cded249b14b817ea25c37dcc Mon Sep 17 00:00:00 2001 From: Richard Smith Date: Fri, 24 Jan 2014 01:54:52 +0000 Subject: [PATCH] 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 --- clang/include/clang/Sema/Sema.h | 4 +++- clang/lib/Sema/TreeTransform.h | 3 ++- 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 f11cb9ca93a0..12a4116f01fb 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 787581d35be4..27380f8c8d44 100644 --- a/clang/lib/Sema/TreeTransform.h +++ b/clang/lib/Sema/TreeTransform.h @@ -8339,7 +8339,8 @@ TreeTransform::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 6e4fd5df5a08..d8a00b3b1e24 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 + int f(); + + struct Y { int b = f(); }; +}