Skip to content

Commit 1755617

Browse files
committed
Avoid crash when dumping NULL Type as JSON.
Patch by Bert Belder. llvm-svn: 370401
1 parent 0785f8d commit 1755617

File tree

3 files changed

+82
-1
lines changed

3 files changed

+82
-1
lines changed

clang/lib/AST/JSONNodeDumper.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,10 @@ void JSONNodeDumper::Visit(const Stmt *S) {
6666

6767
void JSONNodeDumper::Visit(const Type *T) {
6868
JOS.attribute("id", createPointerRepresentation(T));
69+
70+
if (!T)
71+
return;
72+
6973
JOS.attribute("kind", (llvm::Twine(T->getTypeClassName()) + "Type").str());
7074
JOS.attribute("type", createQualType(QualType(T, 0), /*Desugar*/ false));
7175
attributeOnlyIfTrue("isDependent", T->isDependentType());

clang/test/AST/ast-dump-types-json.cpp

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,11 @@ typedef int T::*TestMemberDataPointerType;
2020

2121
typedef int TestQualTypePrinting(const char* c);
2222

23+
typedef int TestUsingShadowDeclType;
24+
namespace TestNamespaceWithUsingShadowType {
25+
using ::TestUsingShadowDeclType;
26+
}
27+
2328
// NOTE: CHECK lines have been autogenerated by gen_ast_dump_json_test.py
2429

2530

@@ -422,3 +427,75 @@ typedef int TestQualTypePrinting(const char* c);
422427
// CHECK-NEXT: }
423428
// CHECK-NEXT: ]
424429
// CHECK-NEXT: }
430+
431+
// CHECK: "kind": "NamespaceDecl",
432+
// CHECK-NEXT: "loc": {
433+
// CHECK-NEXT: "file": "{{.*}}",
434+
// CHECK-NEXT: "line": 24,
435+
// CHECK-NEXT: "col": 11,
436+
// CHECK-NEXT: "tokLen": 32
437+
// CHECK-NEXT: },
438+
// CHECK-NEXT: "range": {
439+
// CHECK-NEXT: "begin": {
440+
// CHECK-NEXT: "col": 1,
441+
// CHECK-NEXT: "tokLen": 9
442+
// CHECK-NEXT: },
443+
// CHECK-NEXT: "end": {
444+
// CHECK-NEXT: "line": 26,
445+
// CHECK-NEXT: "col": 1,
446+
// CHECK-NEXT: "tokLen": 1
447+
// CHECK-NEXT: }
448+
// CHECK-NEXT: },
449+
// CHECK-NEXT: "name": "TestNamespaceWithUsingShadowType",
450+
// CHECK-NEXT: "inner": [
451+
// CHECK-NEXT: {
452+
// CHECK-NEXT: "id": "0x{{.*}}",
453+
// CHECK-NEXT: "kind": "UsingDecl",
454+
// CHECK-NEXT: "loc": {
455+
// CHECK-NEXT: "line": 25,
456+
// CHECK-NEXT: "col": 9,
457+
// CHECK-NEXT: "tokLen": 23
458+
// CHECK-NEXT: },
459+
// CHECK-NEXT: "range": {
460+
// CHECK-NEXT: "begin": {
461+
// CHECK-NEXT: "col": 1,
462+
// CHECK-NEXT: "tokLen": 5
463+
// CHECK-NEXT: },
464+
// CHECK-NEXT: "end": {
465+
// CHECK-NEXT: "col": 9,
466+
// CHECK-NEXT: "tokLen": 23
467+
// CHECK-NEXT: }
468+
// CHECK-NEXT: },
469+
// CHECK-NEXT: "name": "::TestUsingShadowDeclType"
470+
// CHECK-NEXT: },
471+
// CHECK-NEXT: {
472+
// CHECK-NEXT: "id": "0x{{.*}}",
473+
// CHECK-NEXT: "kind": "UsingShadowDecl",
474+
// CHECK-NEXT: "loc": {
475+
// CHECK-NEXT: "col": 9,
476+
// CHECK-NEXT: "tokLen": 23
477+
// CHECK-NEXT: },
478+
// CHECK-NEXT: "range": {
479+
// CHECK-NEXT: "begin": {
480+
// CHECK-NEXT: "col": 9,
481+
// CHECK-NEXT: "tokLen": 23
482+
// CHECK-NEXT: },
483+
// CHECK-NEXT: "end": {
484+
// CHECK-NEXT: "col": 9,
485+
// CHECK-NEXT: "tokLen": 23
486+
// CHECK-NEXT: }
487+
// CHECK-NEXT: },
488+
// CHECK-NEXT: "isImplicit": true,
489+
// CHECK-NEXT: "target": {
490+
// CHECK-NEXT: "id": "0x{{.*}}",
491+
// CHECK-NEXT: "kind": "TypedefDecl",
492+
// CHECK-NEXT: "name": "TestUsingShadowDeclType"
493+
// CHECK-NEXT: },
494+
// CHECK-NEXT: "inner": [
495+
// CHECK-NEXT: {
496+
// CHECK-NEXT: "id": "0x0"
497+
// CHECK-NEXT: }
498+
// CHECK-NEXT: ]
499+
// CHECK-NEXT: }
500+
// CHECK-NEXT: ]
501+
// CHECK-NEXT: }

clang/test/AST/gen_ast_dump_json_test.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ def normalize(dict_var):
2020
normalize(e)
2121
elif type(v) is unicode:
2222
st = v.encode('utf-8')
23-
if re.match(r"0x[0-9A-Fa-f]+", v):
23+
if v != "0x0" and re.match(r"0x[0-9A-Fa-f]+", v):
2424
dict_var[k] = u'0x{{.*}}'
2525
elif os.path.isfile(v):
2626
dict_var[k] = u'{{.*}}'

0 commit comments

Comments
 (0)