aboutsummaryrefslogtreecommitdiff
path: root/clang/lib/Parse/ParseDecl.cpp
diff options
context:
space:
mode:
authorHaojian Wu <hokein.wu@gmail.com>2020-10-12 10:45:37 +0200
committerHaojian Wu <hokein.wu@gmail.com>2020-10-12 10:46:18 +0200
commit702529d899c87e9268bb33d836dbc91b6bce0b16 (patch)
tree176ff054362e9cd40bfc94883c63a7e6a25762a7 /clang/lib/Parse/ParseDecl.cpp
parent60cf8453d0beeb510900eda82b5a26b21af49907 (diff)
downloadllvm-702529d899c87e9268bb33d836dbc91b6bce0b16.zip
llvm-702529d899c87e9268bb33d836dbc91b6bce0b16.tar.gz
llvm-702529d899c87e9268bb33d836dbc91b6bce0b16.tar.bz2
[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
Diffstat (limited to 'clang/lib/Parse/ParseDecl.cpp')
-rw-r--r--clang/lib/Parse/ParseDecl.cpp8
1 files changed, 5 insertions, 3 deletions
diff --git a/clang/lib/Parse/ParseDecl.cpp b/clang/lib/Parse/ParseDecl.cpp
index 3f314c5..01a1657 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