Add a C++11 and C2x spelling for the objc_bridge_related attribute in the clang vendo...
authorAaron Ballman <aaron@aaronballman.com>
Sat, 24 Feb 2018 17:37:37 +0000 (17:37 +0000)
committerAaron Ballman <aaron@aaronballman.com>
Sat, 24 Feb 2018 17:37:37 +0000 (17:37 +0000)
This attribute has custom parsing rules that previously prevented it from being supported with square bracket notation.

llvm-svn: 326038

clang/include/clang/Basic/Attr.td
clang/lib/Parse/ParseDecl.cpp
clang/test/Sema/attr-objc-bridge-related.m [new file with mode: 0644]

index 1efede7..339fbb8 100644 (file)
@@ -1503,9 +1503,7 @@ def ObjCBridgeMutable : InheritableAttr {
 }
 
 def ObjCBridgeRelated : InheritableAttr {
-  // TODO: this attribute does not have a [[]] spelling because it requires
-  // custom parsing support.
-  let Spellings = [GNU<"objc_bridge_related">];
+  let Spellings = [Clang<"objc_bridge_related", 1>];
   let Subjects = SubjectList<[Record], ErrorDiag>;
   let Args = [IdentifierArgument<"RelatedClass">,
           IdentifierArgument<"ClassMethod", 1>,
index ade822b..d79ca8a 100644 (file)
@@ -416,6 +416,10 @@ unsigned Parser::ParseClangAttributeArgs(
     ParseAvailabilityAttribute(*AttrName, AttrNameLoc, Attrs, EndLoc, ScopeName,
                                ScopeLoc, Syntax);
     break;
+  case AttributeList::AT_ObjCBridgeRelated:
+    ParseObjCBridgeRelatedAttribute(*AttrName, AttrNameLoc, Attrs, EndLoc,
+                                    ScopeName, ScopeLoc, Syntax);
+    break;
   }
   return Attrs.getList() ? Attrs.getList()->getNumArgs() : 0;
 }
diff --git a/clang/test/Sema/attr-objc-bridge-related.m b/clang/test/Sema/attr-objc-bridge-related.m
new file mode 100644 (file)
index 0000000..bf059ba
--- /dev/null
@@ -0,0 +1,7 @@
+// RUN: %clang_cc1 -verify -fsyntax-only -fdouble-square-bracket-attributes %s
+
+struct [[clang::objc_bridge_related(NSParagraphStyle,,)]] TestBridgedRef;
+
+struct [[clang::objc_bridge_related(NSColor,colorWithCGColor:,CGColor)]] CGColorRefOk;
+struct [[clang::objc_bridge_related(,colorWithCGColor:,CGColor)]] CGColorRef1NotOk; // expected-error {{expected a related ObjectiveC class name, e.g., 'NSColor'}}
+struct [[clang::objc_bridge_related(NSColor,colorWithCGColor::,CGColor)]] CGColorRef3NotOk; // expected-error {{expected a class method selector with single argument, e.g., 'colorWithCGColor:'}}