r347627 - [MS] Push fewer DeclContexts for delayed template parsing

Reid Kleckner via cfe-commits cfe-commits at lists.llvm.org
Mon Nov 26 18:21:51 PST 2018


Author: rnk
Date: Mon Nov 26 18:21:51 2018
New Revision: 347627

URL: http://llvm.org/viewvc/llvm-project?rev=347627&view=rev
Log:
[MS] Push fewer DeclContexts for delayed template parsing

Only push the outermost record as a DeclContext when parsing a function
body. See the comments in Sema::getContainingDC about the way the parser
pushes contexts. This is intended to match the behavior the parser
normally displays where it parses all method bodies from all nested
classes at the end of the outermost class, when all nested classes are
complete.

Fixes PR38460.

Modified:
    cfe/trunk/lib/Parse/ParseTemplate.cpp
    cfe/trunk/test/Parser/DelayedTemplateParsing.cpp

Modified: cfe/trunk/lib/Parse/ParseTemplate.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/ParseTemplate.cpp?rev=347627&r1=347626&r2=347627&view=diff
==============================================================================
--- cfe/trunk/lib/Parse/ParseTemplate.cpp (original)
+++ cfe/trunk/lib/Parse/ParseTemplate.cpp Mon Nov 26 18:21:51 2018
@@ -1382,7 +1382,7 @@ void Parser::ParseLateTemplatedFuncDef(L
   SmallVector<ParseScope*, 4> TemplateParamScopeStack;
 
   // Get the list of DeclContexts to reenter.
-  SmallVector<DeclContext*, 4> DeclContextsToReenter;
+  SmallVector<DeclContext *, 4> DeclContextsToReenter;
   DeclContext *DD = FunD;
   while (DD && !DD->isTranslationUnit()) {
     DeclContextsToReenter.push_back(DD);
@@ -1398,7 +1398,12 @@ void Parser::ParseLateTemplatedFuncDef(L
     unsigned NumParamLists =
       Actions.ActOnReenterTemplateScope(getCurScope(), cast<Decl>(*II));
     CurTemplateDepthTracker.addDepth(NumParamLists);
-    if (*II != FunD) {
+    // If we find a class in a class, we need to push the context of the
+    // outermost class to match up with how we would parse a regular C++ class
+    // inline method.
+    if (*II != FunD &&
+        !(isa<CXXRecordDecl>(*II) && isa<CXXRecordDecl>(Actions.CurContext) &&
+          Actions.CurContext == (*II)->getLexicalParent())) {
       TemplateParamScopeStack.push_back(new ParseScope(this, Scope::DeclScope));
       Actions.PushDeclContext(Actions.getCurScope(), *II);
     }

Modified: cfe/trunk/test/Parser/DelayedTemplateParsing.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Parser/DelayedTemplateParsing.cpp?rev=347627&r1=347626&r2=347627&view=diff
==============================================================================
--- cfe/trunk/test/Parser/DelayedTemplateParsing.cpp (original)
+++ cfe/trunk/test/Parser/DelayedTemplateParsing.cpp Mon Nov 26 18:21:51 2018
@@ -181,3 +181,20 @@ static void h() {
 }
 
 }
+
+struct PR38460 {
+  template <typename>
+  struct T {
+    static void foo() {
+      struct U {
+        void dummy() {
+          use_delayed_identifier();
+        }
+      };
+    }
+  };
+};
+void use_delayed_identifier();
+void trigger_PR38460() {
+  PR38460::T<int>::foo();
+}




More information about the cfe-commits mailing list