Skip to content

Commit 99df06a

Browse files
authored
[AST] Dump explicit template arguments for UnreslovedLookupExpr. (#90466)
Having them dump is useful for ad-hoc debugging (context: #90046)
1 parent 5b1cc58 commit 99df06a

File tree

3 files changed

+108
-0
lines changed

3 files changed

+108
-0
lines changed

clang/include/clang/AST/ASTNodeTraverser.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -844,6 +844,12 @@ class ASTNodeTraverser
844844
}
845845
}
846846

847+
void VisitUnresolvedLookupExpr(const UnresolvedLookupExpr *E) {
848+
if (E->hasExplicitTemplateArgs())
849+
for (auto Arg : E->template_arguments())
850+
Visit(Arg.getArgument());
851+
}
852+
847853
void VisitRequiresExpr(const RequiresExpr *E) {
848854
for (auto *D : E->getLocalParameters())
849855
Visit(D);

clang/test/AST/ast-dump-template-json-win32-mangler-crash.cpp

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1846,6 +1846,42 @@ int main()
18461846
// CHECK-NEXT: "kind": "VarTemplateDecl",
18471847
// CHECK-NEXT: "name": "is_const_v"
18481848
// CHECK-NEXT: }
1849+
// CHECK-NEXT: ],
1850+
// CHECK-NEXT: "inner": [
1851+
// CHECK-NEXT: {
1852+
// CHECK-NEXT: "kind": "TemplateArgument",
1853+
// CHECK-NEXT: "type": {
1854+
// CHECK-NEXT: "qualType": "const _Ty"
1855+
// CHECK-NEXT: },
1856+
// CHECK-NEXT: "inner": [
1857+
// CHECK-NEXT: {
1858+
// CHECK-NEXT: "id": "0x{{.*}}",
1859+
// CHECK-NEXT: "kind": "QualType",
1860+
// CHECK-NEXT: "type": {
1861+
// CHECK-NEXT: "qualType": "const _Ty"
1862+
// CHECK-NEXT: },
1863+
// CHECK-NEXT: "qualifiers": "const",
1864+
// CHECK-NEXT: "inner": [
1865+
// CHECK-NEXT: {
1866+
// CHECK-NEXT: "id": "0x{{.*}}",
1867+
// CHECK-NEXT: "kind": "TemplateTypeParmType",
1868+
// CHECK-NEXT: "type": {
1869+
// CHECK-NEXT: "qualType": "_Ty"
1870+
// CHECK-NEXT: },
1871+
// CHECK-NEXT: "isDependent": true,
1872+
// CHECK-NEXT: "isInstantiationDependent": true,
1873+
// CHECK-NEXT: "depth": 0,
1874+
// CHECK-NEXT: "index": 0,
1875+
// CHECK-NEXT: "decl": {
1876+
// CHECK-NEXT: "id": "0x{{.*}}",
1877+
// CHECK-NEXT: "kind": "TemplateTypeParmDecl",
1878+
// CHECK-NEXT: "name": "_Ty"
1879+
// CHECK-NEXT: }
1880+
// CHECK-NEXT: }
1881+
// CHECK-NEXT: ]
1882+
// CHECK-NEXT: }
1883+
// CHECK-NEXT: ]
1884+
// CHECK-NEXT: }
18491885
// CHECK-NEXT: ]
18501886
// CHECK-NEXT: }
18511887
// CHECK-NEXT: ]
@@ -1900,6 +1936,32 @@ int main()
19001936
// CHECK-NEXT: "kind": "VarTemplateDecl",
19011937
// CHECK-NEXT: "name": "is_reference_v"
19021938
// CHECK-NEXT: }
1939+
// CHECK-NEXT: ],
1940+
// CHECK-NEXT: "inner": [
1941+
// CHECK-NEXT: {
1942+
// CHECK-NEXT: "kind": "TemplateArgument",
1943+
// CHECK-NEXT: "type": {
1944+
// CHECK-NEXT: "qualType": "_Ty"
1945+
// CHECK-NEXT: },
1946+
// CHECK-NEXT: "inner": [
1947+
// CHECK-NEXT: {
1948+
// CHECK-NEXT: "id": "0x{{.*}}",
1949+
// CHECK-NEXT: "kind": "TemplateTypeParmType",
1950+
// CHECK-NEXT: "type": {
1951+
// CHECK-NEXT: "qualType": "_Ty"
1952+
// CHECK-NEXT: },
1953+
// CHECK-NEXT: "isDependent": true,
1954+
// CHECK-NEXT: "isInstantiationDependent": true,
1955+
// CHECK-NEXT: "depth": 0,
1956+
// CHECK-NEXT: "index": 0,
1957+
// CHECK-NEXT: "decl": {
1958+
// CHECK-NEXT: "id": "0x{{.*}}",
1959+
// CHECK-NEXT: "kind": "TemplateTypeParmDecl",
1960+
// CHECK-NEXT: "name": "_Ty"
1961+
// CHECK-NEXT: }
1962+
// CHECK-NEXT: }
1963+
// CHECK-NEXT: ]
1964+
// CHECK-NEXT: }
19031965
// CHECK-NEXT: ]
19041966
// CHECK-NEXT: }
19051967
// CHECK-NEXT: ]
@@ -2565,6 +2627,32 @@ int main()
25652627
// CHECK-NEXT: "kind": "VarTemplateDecl",
25662628
// CHECK-NEXT: "name": "is_function_v"
25672629
// CHECK-NEXT: }
2630+
// CHECK-NEXT: ],
2631+
// CHECK-NEXT: "inner": [
2632+
// CHECK-NEXT: {
2633+
// CHECK-NEXT: "kind": "TemplateArgument",
2634+
// CHECK-NEXT: "type": {
2635+
// CHECK-NEXT: "qualType": "_Ty1"
2636+
// CHECK-NEXT: },
2637+
// CHECK-NEXT: "inner": [
2638+
// CHECK-NEXT: {
2639+
// CHECK-NEXT: "id": "0x{{.*}}",
2640+
// CHECK-NEXT: "kind": "TemplateTypeParmType",
2641+
// CHECK-NEXT: "type": {
2642+
// CHECK-NEXT: "qualType": "_Ty1"
2643+
// CHECK-NEXT: },
2644+
// CHECK-NEXT: "isDependent": true,
2645+
// CHECK-NEXT: "isInstantiationDependent": true,
2646+
// CHECK-NEXT: "depth": 0,
2647+
// CHECK-NEXT: "index": 0,
2648+
// CHECK-NEXT: "decl": {
2649+
// CHECK-NEXT: "id": "0x{{.*}}",
2650+
// CHECK-NEXT: "kind": "TemplateTypeParmDecl",
2651+
// CHECK-NEXT: "name": "_Ty1"
2652+
// CHECK-NEXT: }
2653+
// CHECK-NEXT: }
2654+
// CHECK-NEXT: ]
2655+
// CHECK-NEXT: }
25682656
// CHECK-NEXT: ]
25692657
// CHECK-NEXT: }
25702658
// CHECK-NEXT: ]

clang/test/AST/ast-dump-templates.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,3 +104,17 @@ void (*q)() = f<>;
104104
// CHECK1: template<> void f<0L>()
105105
// CHECK1: template<> void f<0U>()
106106
}
107+
108+
namespace test6 {
109+
template <class D>
110+
constexpr bool C = true;
111+
112+
template <class Key>
113+
void func() {
114+
C<Key>;
115+
// DUMP: UnresolvedLookupExpr {{.*}} '<dependent type>' lvalue (no ADL) = 'C'
116+
// DUMP-NEXT: `-TemplateArgument type 'Key'
117+
// DUMP-NEXT: `-TemplateTypeParmType {{.*}} 'Key' dependent depth 0 index 0
118+
// DUMP-NEXT: `-TemplateTypeParm {{.*}} 'Key'
119+
}
120+
}

0 commit comments

Comments
 (0)