diff --git a/include/clang/Sema/Sema.h b/include/clang/Sema/Sema.h index f11cb9ca93a0348ba6587d1d292a95d398339539..12a4116f01fb7f7aee299254c231e7e2a5247c32 100644 --- a/include/clang/Sema/Sema.h +++ b/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/lib/Sema/TreeTransform.h b/lib/Sema/TreeTransform.h index 787581d35be4fcedf52600d270eecfe281cbbe92..27380f8c8d44df980b9fbfb5c6548c9a4c03cb61 100644 --- a/lib/Sema/TreeTransform.h +++ b/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/test/SemaCXX/member-init.cpp b/test/SemaCXX/member-init.cpp index 6e4fd5df5a08a6b1f7fc96b78fcfdc8040a81b40..d8a00b3b1e24d87fe0595be350e091509e5568f0 100644 --- a/test/SemaCXX/member-init.cpp +++ b/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(); }; +}