[clang-tools-extra] 702529d - [clang] Fix returning the underlying VarDecl as top-level decl for VarTemplateDecl.

Haojian Wu via cfe-commits cfe-commits at lists.llvm.org
Mon Oct 12 06:43:08 PDT 2020


sorry, I'm looking at it.

On Mon, 12 Oct 2020 at 15:35, Hubert Tong <hubert.reinterpretcast at gmail.com>
wrote:

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


More information about the cfe-commits mailing list