Author: David Tolnay Date: 2021-04-24T12:28:10-04:00 New Revision: 967ebad12521f3187014a722804c27a75d44e649
URL: https://github.com/llvm/llvm-project/commit/967ebad12521f3187014a722804c27a75d44e649 DIFF: https://github.com/llvm/llvm-project/commit/967ebad12521f3187014a722804c27a75d44e649.diff LOG: Fix null ptr crash dumping TemplateTemplateParmDecl 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(); This patch fixes the null pointer dereference. Added: Modified: clang/lib/AST/JSONNodeDumper.cpp clang/test/AST/ast-dump-template-decls-json.cpp Removed: ################################################################################ diff --git a/clang/lib/AST/JSONNodeDumper.cpp b/clang/lib/AST/JSONNodeDumper.cpp index 7b99546bbe2d..5909812728a6 100644 --- a/clang/lib/AST/JSONNodeDumper.cpp +++ b/clang/lib/AST/JSONNodeDumper.cpp @@ -887,9 +887,10 @@ void JSONNodeDumper::VisitTemplateTemplateParmDecl( 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"); }); } diff --git a/clang/test/AST/ast-dump-template-decls-json.cpp b/clang/test/AST/ast-dump-template-decls-json.cpp index f074d6f0137d..81b308e4fb74 100644 --- a/clang/test/AST/ast-dump-template-decls-json.cpp +++ b/clang/test/AST/ast-dump-template-decls-json.cpp @@ -55,6 +55,9 @@ template <typename Ty> 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 @@ void V<Ty>::f() {} // 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: } _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits