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 <typename> struct R; template <template <typename> 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 <typename Uy> void V<Ty>::f() {} +template <template <typename> 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: "offset": 917, +// CHECK-NEXT: "col": 1, +// CHECK-NEXT: "tokLen": 4 +// CHECK-NEXT: }, +// CHECK-NEXT: "end": { +// CHECK-NEXT: "offset": 924, +// CHECK-NEXT: "col": 8, +// CHECK-NEXT: "tokLen": 1 +// CHECK-NEXT: } +// CHECK-NEXT: }, +// CHECK-NEXT: "name": "i", +// CHECK-NEXT: "type": { +// CHECK-NEXT: "qualType": "void ()" +// CHECK-NEXT: } +// CHECK-NEXT: } +// CHECK-NEXT: ] // CHECK-NEXT: } // CHECK-NEXT: ] // CHECK-NEXT: } Index: clang/lib/AST/JSONNodeDumper.cpp =================================================================== --- clang/lib/AST/JSONNodeDumper.cpp +++ clang/lib/AST/JSONNodeDumper.cpp @@ -887,9 +887,10 @@ if (D->hasDefaultArgument()) JOS.attributeObject("defaultArg", [=] { + const auto *InheritedFrom = D->getDefaultArgStorage().getInheritedFrom(); Visit(D->getDefaultArgument().getArgument(), - D->getDefaultArgStorage().getInheritedFrom()->getSourceRange(), - D->getDefaultArgStorage().getInheritedFrom(), + InheritedFrom ? InheritedFrom->getSourceRange() : SourceLocation{}, + InheritedFrom, D->defaultArgumentWasInherited() ? "inherited from" : "previous"); }); }
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits