From: Aaron Ballman Date: Mon, 30 Nov 2015 15:25:34 +0000 (+0000) Subject: Do not crash when dumping the objc_bridge_related attribute when its optional argumen... X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=f1e212a7a96d429999adf29095df89eac2a0f35b;p=clang Do not crash when dumping the objc_bridge_related attribute when its optional arguments are not supplied. Patch thanks to Joe Ranieri! git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@254303 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Basic/Attr.td b/include/clang/Basic/Attr.td index 1281c3f477..c761aa9451 100644 --- a/include/clang/Basic/Attr.td +++ b/include/clang/Basic/Attr.td @@ -1087,8 +1087,8 @@ def ObjCBridgeRelated : InheritableAttr { let Spellings = [GNU<"objc_bridge_related">]; let Subjects = SubjectList<[Record], ErrorDiag>; let Args = [IdentifierArgument<"RelatedClass">, - IdentifierArgument<"ClassMethod">, - IdentifierArgument<"InstanceMethod">]; + IdentifierArgument<"ClassMethod", 1>, + IdentifierArgument<"InstanceMethod", 1>]; let HasCustomParsing = 1; let Documentation = [Undocumented]; } diff --git a/test/Misc/ast-dump-attr.cpp b/test/Misc/ast-dump-attr.cpp index ed6d1f5781..e0575cb18d 100644 --- a/test/Misc/ast-dump-attr.cpp +++ b/test/Misc/ast-dump-attr.cpp @@ -150,3 +150,7 @@ void f() { // CHECK: DeprecatedAttr } } + +struct __attribute__((objc_bridge_related(NSParagraphStyle,,))) TestBridgedRef; +// CHECK: CXXRecordDecl{{.*}} struct TestBridgedRef +// CHECK-NEXT: ObjCBridgeRelatedAttr{{.*}} NSParagraphStyle diff --git a/utils/TableGen/ClangAttrEmitter.cpp b/utils/TableGen/ClangAttrEmitter.cpp index 0c28576498..09d7aee3c3 100644 --- a/utils/TableGen/ClangAttrEmitter.cpp +++ b/utils/TableGen/ClangAttrEmitter.cpp @@ -279,6 +279,8 @@ namespace { OS << " OS << \" \";\n"; OS << " dumpBareDeclRef(SA->get" << getUpperName() << "());\n"; } else if (type == "IdentifierInfo *") { + if (isOptional()) + OS << " if (SA->get" << getUpperName() << "())\n "; OS << " OS << \" \" << SA->get" << getUpperName() << "()->getName();\n"; } else if (type == "TypeSourceInfo *") {