dtolnay created this revision.
dtolnay added a reviewer: aaron.ballman.
Herald added a subscriber: kristof.beyls.
dtolnay requested review of this revision.
Herald added a project: clang.
Minimal repro-- the following program winds up with
D->getDefaultArgStorage().getInheritedFrom() == nullptr during dumping the
TemplateTemplateParmDecl corresponding to the template parameter of i.
template
struct R;
template class = R>
void i();
Previously--
#6 clang::TemplateTemplateParmDecl::getSourceRange() const
clang/include/clang/AST/DeclTemplate.h:1745
#15
clang::JSONNodeDumper::VisitTemplateTemplateParmDecl(clang::TemplateTemplateParmDecl
const*) clang/lib/AST/JSONNodeDumper.cpp:889
#16 clang::JSONNodeDumper::Visit(clang::Decl const*)
clang/lib/AST/JSONNodeDumper.cpp:128
...
clang-13: error: unable to execute command: Segmentation fault (core dumped)
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D101212
Files:
clang/lib/AST/JSONNodeDumper.cpp
clang/test/AST/ast-dump-template-decls-json.cpp
Index: clang/test/AST/ast-dump-template-decls-json.cpp
===
--- clang/test/AST/ast-dump-template-decls-json.cpp
+++ clang/test/AST/ast-dump-template-decls-json.cpp
@@ -55,6 +55,9 @@
template
void V::f() {}
+template class = R>
+void i();
+
// NOTE: CHECK lines have been autogenerated by gen_ast_dump_json_test.py
@@ -2578,6 +2581,127 @@
// CHECK-NEXT: ]
// CHECK-NEXT: }
// CHECK-NEXT:]
+// CHECK-NEXT: },
+// CHECK-NEXT: {
+// CHECK-NEXT:"id": "0x{{.*}}",
+// CHECK-NEXT:"kind": "FunctionTemplateDecl",
+// CHECK-NEXT:"loc": {
+// CHECK-NEXT: "offset": 922,
+// CHECK-NEXT: "line": 59,
+// CHECK-NEXT: "col": 6,
+// CHECK-NEXT: "tokLen": 1
+// CHECK-NEXT:},
+// CHECK-NEXT:"range": {
+// CHECK-NEXT: "begin": {
+// CHECK-NEXT: "offset": 876,
+// CHECK-NEXT: "line": 58,
+// CHECK-NEXT: "col": 1,
+// CHECK-NEXT: "tokLen": 8
+// CHECK-NEXT: },
+// CHECK-NEXT: "end": {
+// CHECK-NEXT: "offset": 924,
+// CHECK-NEXT: "line": 59,
+// CHECK-NEXT: "col": 8,
+// CHECK-NEXT: "tokLen": 1
+// CHECK-NEXT: }
+// CHECK-NEXT:},
+// CHECK-NEXT:"name": "i",
+// CHECK-NEXT:"inner": [
+// CHECK-NEXT: {
+// CHECK-NEXT: "id": "0x{{.*}}",
+// CHECK-NEXT: "kind": "TemplateTemplateParmDecl",
+// CHECK-NEXT: "loc": {
+// CHECK-NEXT: "offset": 912,
+// CHECK-NEXT: "line": 58,
+// CHECK-NEXT: "col": 37,
+// CHECK-NEXT: "tokLen": 1
+// CHECK-NEXT: },
+// CHECK-NEXT: "range": {
+// CHECK-NEXT: "begin": {
+// CHECK-NEXT:"offset": 886,
+// CHECK-NEXT:"col": 11,
+// CHECK-NEXT:"tokLen": 8
+// CHECK-NEXT: },
+// CHECK-NEXT: "end": {
+// CHECK-NEXT:"offset": 914,
+// CHECK-NEXT:"col": 39,
+// CHECK-NEXT:"tokLen": 1
+// CHECK-NEXT: }
+// CHECK-NEXT: },
+// CHECK-NEXT: "depth": 0,
+// CHECK-NEXT: "index": 0,
+// CHECK-NEXT: "defaultArg": {
+// CHECK-NEXT: "kind": "TemplateArgument"
+// CHECK-NEXT: },
+// CHECK-NEXT: "inner": [
+// CHECK-NEXT: {
+// CHECK-NEXT:"id": "0x{{.*}}",
+// CHECK-NEXT:"kind": "TemplateTypeParmDecl",
+// CHECK-NEXT:"loc": {
+// CHECK-NEXT: "offset": 904,
+// CHECK-NEXT: "col": 29,
+// CHECK-NEXT: "tokLen": 1
+// CHECK-NEXT:},
+// CHECK-NEXT:"range": {
+// CHECK-NEXT: "begin": {
+// CHECK-NEXT: "offset": 896,
+// CHECK-NEXT: "col": 21,
+// CHECK-NEXT: "tokLen": 8
+// CHECK-NEXT: },
+// CHECK-NEXT: "end": {
+// CHECK-NEXT: "offset": 896,
+// CHECK-NEXT: "col": 21,
+// CHECK-NEXT: "tokLen": 8
+// CHECK-NEXT: }
+// CHECK-NEXT:},
+// CHECK-NEXT:"tagUsed": "typename",
+// CHECK-NEXT:"depth": 1,
+// CHECK-NEXT:"index": 0
+// CHECK-NEXT: },
+// CHECK-NEXT: {
+// CHECK-NEXT:"kind": "TemplateArgument",
+// CHECK-NEXT:"range": {
+// CHECK-NEXT: "begin": {
+// CHECK-NEXT: "offset": 914,
+// CHECK-NEXT: "col": 39,
+// CHECK-NEXT: "tokLen": 1
+// CHECK-NEXT: },
+// CHECK-NEXT: "end": {
+// CHECK-NEXT: "offset": 914,
+// CHECK-NEXT: "col": 39,
+// CHECK-NEXT: "tokLen": 1
+// CHECK-NEXT: }
+// CHECK-NEXT:}
+// CHECK-NEXT: }
+// CHECK-NEXT: ]
+// CHECK-NEXT: },
+// CHECK-NEXT: {
+// CHECK-NEXT: "id": "0x{{.*}}",
+// CHECK-NEXT: "kind": "FunctionDecl",
+// CHECK-NEXT: "loc": {
+// CHECK-NEXT: "offset": 922,
+// CHECK-NEXT: "line": 59,
+// CHECK-NEXT: "col": 6,
+// CHECK-NEXT: "tokLen": 1
+// CHECK-NEXT: },
+// CHECK-NEXT: "range": {
+// CHECK-NEXT: "begin": {
+// CHECK-NEXT:"of