Skip to content

Commit 93f32c2

Browse files
committed
fix: Parse of template nested name specifier
1 parent 6e43b5b commit 93f32c2

File tree

2 files changed

+93
-1
lines changed

2 files changed

+93
-1
lines changed

src/parser/cxx/parser.cc

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -842,7 +842,8 @@ auto Parser::parse_nested_name_specifier(NestedNameSpecifierAST*& yyast)
842842
const auto isTemplateIntroduced = match(TokenKind::T_TEMPLATE, templateLoc);
843843

844844
SimpleTemplateIdAST* templateName = nullptr;
845-
if (!parse_simple_template_id(templateName)) return false;
845+
if (!parse_simple_template_id(templateName, isTemplateIntroduced))
846+
return false;
846847

847848
SourceLocation scopeLoc;
848849
if (!match(TokenKind::T_COLON_COLON, scopeLoc)) return false;
Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
// RUN: %cxx -verify -ast-dump %s | %filecheck %s --match-full-lines
2+
3+
struct HelperT {
4+
template <typename T>
5+
struct Lookup {
6+
using PointerT = T*;
7+
};
8+
};
9+
10+
template <int N>
11+
void set(typename HelperT::template Lookup<int>::PointerT p);
12+
// clang-format off
13+
// CHECK:translation-unit
14+
// CHECK-NEXT: declaration-list
15+
// CHECK-NEXT: simple-declaration
16+
// CHECK-NEXT: decl-specifier-list
17+
// CHECK-NEXT: class-specifier
18+
// CHECK-NEXT: class-key: struct
19+
// CHECK-NEXT: unqualified-id: name-id
20+
// CHECK-NEXT: identifier: HelperT
21+
// CHECK-NEXT: declaration-list
22+
// CHECK-NEXT: template-declaration
23+
// CHECK-NEXT: template-parameter-list
24+
// CHECK-NEXT: typename-type-parameter
25+
// CHECK-NEXT: identifier: T
26+
// CHECK-NEXT: declaration: simple-declaration
27+
// CHECK-NEXT: decl-specifier-list
28+
// CHECK-NEXT: class-specifier
29+
// CHECK-NEXT: class-key: struct
30+
// CHECK-NEXT: unqualified-id: name-id
31+
// CHECK-NEXT: identifier: Lookup
32+
// CHECK-NEXT: declaration-list
33+
// CHECK-NEXT: alias-declaration
34+
// CHECK-NEXT: identifier: PointerT
35+
// CHECK-NEXT: type-id: type-id
36+
// CHECK-NEXT: type-specifier-list
37+
// CHECK-NEXT: named-type-specifier
38+
// CHECK-NEXT: unqualified-id: name-id
39+
// CHECK-NEXT: identifier: T
40+
// CHECK-NEXT: declarator: declarator
41+
// CHECK-NEXT: ptr-op-list
42+
// CHECK-NEXT: pointer-operator
43+
// CHECK-NEXT: template-declaration
44+
// CHECK-NEXT: template-parameter-list
45+
// CHECK-NEXT: parameter-declaration
46+
// CHECK-NEXT: type-specifier-list
47+
// CHECK-NEXT: integral-type-specifier
48+
// CHECK-NEXT: specifier: int
49+
// CHECK-NEXT: declarator: declarator
50+
// CHECK-NEXT: core-declarator: id-declarator
51+
// CHECK-NEXT: declarator-id: id-expression
52+
// CHECK-NEXT: unqualified-id: name-id
53+
// CHECK-NEXT: identifier: N
54+
// CHECK-NEXT: declaration: simple-declaration
55+
// CHECK-NEXT: decl-specifier-list
56+
// CHECK-NEXT: void-type-specifier
57+
// CHECK-NEXT: init-declarator-list
58+
// CHECK-NEXT: init-declarator
59+
// CHECK-NEXT: declarator: declarator
60+
// CHECK-NEXT: core-declarator: id-declarator
61+
// CHECK-NEXT: declarator-id: id-expression
62+
// CHECK-NEXT: unqualified-id: name-id
63+
// CHECK-NEXT: identifier: set
64+
// CHECK-NEXT: declarator-chunk-list
65+
// CHECK-NEXT: function-declarator-chunk
66+
// CHECK-NEXT: parameters-and-qualifiers: parameters-and-qualifiers
67+
// CHECK-NEXT: parameter-declaration-clause: parameter-declaration-clause
68+
// CHECK-NEXT: parameter-declaration-list
69+
// CHECK-NEXT: parameter-declaration
70+
// CHECK-NEXT: type-specifier-list
71+
// CHECK-NEXT: typename-specifier
72+
// CHECK-NEXT: nested-name-specifier: template-nested-name-specifier
73+
// CHECK-NEXT: is-template-introduced: true
74+
// CHECK-NEXT: nested-name-specifier: simple-nested-name-specifier
75+
// CHECK-NEXT: identifier: HelperT
76+
// CHECK-NEXT: template-id: simple-template-id
77+
// CHECK-NEXT: identifier: Lookup
78+
// CHECK-NEXT: template-argument-list
79+
// CHECK-NEXT: type-template-argument
80+
// CHECK-NEXT: type-id: type-id
81+
// CHECK-NEXT: type-specifier-list
82+
// CHECK-NEXT: integral-type-specifier
83+
// CHECK-NEXT: specifier: int
84+
// CHECK-NEXT: declarator: declarator
85+
// CHECK-NEXT: unqualified-id: name-id
86+
// CHECK-NEXT: identifier: PointerT
87+
// CHECK-NEXT: declarator: declarator
88+
// CHECK-NEXT: core-declarator: id-declarator
89+
// CHECK-NEXT: declarator-id: id-expression
90+
// CHECK-NEXT: unqualified-id: name-id
91+
// CHECK-NEXT: identifier: p

0 commit comments

Comments
 (0)