<div dir="ltr"><div>ParsedASTTest.TopLevelDecls has not recovered on clang-ppc64le-rhel since this went in (even when including f1bf41e433e196ecffcc4fb7cd04c58d48445425, which is purported to fix buildbot failures from this commit).</div><div><br></div><div><a href="http://lab.llvm.org:8011/#/builders/57/builds/81">http://lab.llvm.org:8011/#/builders/57/builds/81</a></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Mon, Oct 12, 2020 at 5:06 AM Haojian Wu via cfe-commits <<a href="mailto:cfe-commits@lists.llvm.org">cfe-commits@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><br>
Author: Haojian Wu<br>
Date: 2020-10-12T10:46:18+02:00<br>
New Revision: 702529d899c87e9268bb33d836dbc91b6bce0b16<br>
<br>
URL: <a href="https://github.com/llvm/llvm-project/commit/702529d899c87e9268bb33d836dbc91b6bce0b16" rel="noreferrer" target="_blank">https://github.com/llvm/llvm-project/commit/702529d899c87e9268bb33d836dbc91b6bce0b16</a><br>
DIFF: <a href="https://github.com/llvm/llvm-project/commit/702529d899c87e9268bb33d836dbc91b6bce0b16.diff" rel="noreferrer" target="_blank">https://github.com/llvm/llvm-project/commit/702529d899c87e9268bb33d836dbc91b6bce0b16.diff</a><br>
<br>
LOG: [clang] Fix returning the underlying VarDecl as top-level decl for VarTemplateDecl.<br>
<br>
Given the following VarTemplateDecl AST,<br>
<br>
```<br>
VarTemplateDecl col:26 X<br>
|-TemplateTypeParmDecl typename depth 0 index 0<br>
`-VarDecl X 'bool' cinit<br>
  `-CXXBoolLiteralExpr 'bool' true<br>
```<br>
<br>
previously, we returned the VarDecl as the top-level decl, which was not<br>
correct, the top-level decl should be VarTemplateDecl.<br>
<br>
Differential Revision: <a href="https://reviews.llvm.org/D89098" rel="noreferrer" target="_blank">https://reviews.llvm.org/D89098</a><br>
<br>
Added: <br>
<br>
<br>
Modified: <br>
    clang-tools-extra/clangd/unittests/ParsedASTTests.cpp<br>
    clang/lib/Parse/ParseDecl.cpp<br>
<br>
Removed: <br>
<br>
<br>
<br>
################################################################################<br>
diff  --git a/clang-tools-extra/clangd/unittests/ParsedASTTests.cpp b/clang-tools-extra/clangd/unittests/ParsedASTTests.cpp<br>
index 65d9cffeedc7..db23438766d2 100644<br>
--- a/clang-tools-extra/clangd/unittests/ParsedASTTests.cpp<br>
+++ b/clang-tools-extra/clangd/unittests/ParsedASTTests.cpp<br>
@@ -57,6 +57,12 @@ MATCHER_P(DeclNamed, Name, "") {<br>
   return false;<br>
 }<br>
<br>
+MATCHER_P(DeclKind, Kind, "") {<br>
+  if (NamedDecl *ND = dyn_cast<NamedDecl>(arg))<br>
+    return ND->getDeclKindName() == Kind;<br>
+  return false;<br>
+}<br>
+<br>
 // Matches if the Decl has template args equal to ArgName. If the decl is a<br>
 // NamedDecl and ArgName is an empty string it also matches.<br>
 MATCHER_P(WithTemplateArgs, ArgName, "") {<br>
@@ -99,9 +105,15 @@ TEST(ParsedASTTest, TopLevelDecls) {<br>
     int header1();<br>
     int header2;<br>
   )";<br>
-  TU.Code = "int main();";<br>
+  TU.Code = R"cpp(<br>
+    int main();<br>
+    template <typename> bool X = true;<br>
+  )cpp";<br>
   auto AST = TU.build();<br>
-  EXPECT_THAT(AST.getLocalTopLevelDecls(), ElementsAre(DeclNamed("main")));<br>
+  EXPECT_THAT(<br>
+      AST.getLocalTopLevelDecls(),<br>
+      ElementsAreArray({AllOf(DeclNamed("main"), DeclKind("Function")),<br>
+                        AllOf(DeclNamed("X"), DeclKind("VarTemplate"))}));<br>
 }<br>
<br>
 TEST(ParsedASTTest, DoesNotGetIncludedTopDecls) {<br>
<br>
diff  --git a/clang/lib/Parse/ParseDecl.cpp b/clang/lib/Parse/ParseDecl.cpp<br>
index 3f314c59ade6..01a16575c239 100644<br>
--- a/clang/lib/Parse/ParseDecl.cpp<br>
+++ b/clang/lib/Parse/ParseDecl.cpp<br>
@@ -2195,6 +2195,7 @@ Decl *Parser::ParseDeclarationAfterDeclaratorAndAttributes(<br>
<br>
   // Inform the current actions module that we just parsed this declarator.<br>
   Decl *ThisDecl = nullptr;<br>
+  Decl *OuterDecl = nullptr;<br>
   switch (TemplateInfo.Kind) {<br>
   case ParsedTemplateInfo::NonTemplate:<br>
     ThisDecl = Actions.ActOnDeclarator(getCurScope(), D);<br>
@@ -2205,10 +2206,12 @@ Decl *Parser::ParseDeclarationAfterDeclaratorAndAttributes(<br>
     ThisDecl = Actions.ActOnTemplateDeclarator(getCurScope(),<br>
                                                *TemplateInfo.TemplateParams,<br>
                                                D);<br>
-    if (VarTemplateDecl *VT = dyn_cast_or_null<VarTemplateDecl>(ThisDecl))<br>
+    if (VarTemplateDecl *VT = dyn_cast_or_null<VarTemplateDecl>(ThisDecl)) {<br>
       // Re-direct this decl to refer to the templated decl so that we can<br>
       // initialize it.<br>
       ThisDecl = VT->getTemplatedDecl();<br>
+      OuterDecl = VT;<br>
+    }<br>
     break;<br>
   }<br>
   case ParsedTemplateInfo::ExplicitInstantiation: {<br>
@@ -2385,8 +2388,7 @@ Decl *Parser::ParseDeclarationAfterDeclaratorAndAttributes(<br>
   }<br>
<br>
   Actions.FinalizeDeclaration(ThisDecl);<br>
-<br>
-  return ThisDecl;<br>
+  return OuterDecl ? OuterDecl : ThisDecl;<br>
 }<br>
<br>
 /// ParseSpecifierQualifierList<br>
<br>
<br>
<br>
_______________________________________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@lists.llvm.org" target="_blank">cfe-commits@lists.llvm.org</a><br>
<a href="https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits" rel="noreferrer" target="_blank">https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits</a><br>
</blockquote></div>