Visibility,
FastCall,
StdCall,
- TransparentUnion
+ TransparentUnion,
+ IBOutletKind // Clang-specific. Use "Kind" suffix to not conflict with
+ // the IBOutlet macro.
};
private:
static bool classof(const Attr *A) { return A->getKind() == Alias; }
static bool classof(const AliasAttr *A) { return true; }
};
+
+class IBOutletAttr : public Attr {
+public:
+ IBOutletAttr() : Attr(IBOutletKind) {}
+
+ // Implement isa/cast/dyncast/etc.
+ static bool classof(const Attr *A) {
+ return A->getKind() == IBOutletKind;
+ }
+ static bool classof(const IBOutletAttr *A) { return true; }
+};
class NoReturnAttr : public Attr {
public:
"type of machine mode does not match type of base type")
DIAG(err_attr_wrong_decl, ERROR,
"'%0' attribute invalid on this declaration, requires typedef or value")
+
+// Clang-Specific Attributes
+DIAG(err_attribute_iboutlet_non_ivar, ERROR,
+ "'IBOutlet' attribute can only be applied to instance variables")
// Function Parameter Semantic Analysis.
DIAG(err_param_with_void_type, ERROR,
AT_ext_vector_type,
AT_fastcall,
AT_format,
+ AT_IBOutlet, // Clang-specific.
AT_malloc,
AT_mode,
AT_noinline,
Str += 2;
Len -= 4;
}
-
+
switch (Len) {
case 4:
if (!memcmp(Str, "weak", 4)) return AT_weak;
if (!memcmp(Str, "noreturn", 8)) return AT_noreturn;
if (!memcmp(Str, "noinline", 8)) return AT_noinline;
if (!memcmp(Str, "fastcall", 8)) return AT_fastcall;
+ if (!memcmp(Str, "IBOutlet", 8)) return AT_IBOutlet;
break;
case 9:
if (!memcmp(Str, "dllimport", 9)) return AT_dllimport;
Attr.getName()->getName());
}
+static void HandleIBOutletAttr(Decl *d, const AttributeList &Attr, Sema &S) {
+ // check the attribute arguments.
+ if (Attr.getNumArgs() > 0) {
+ S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments,
+ std::string("0"));
+ return;
+ }
+
+ // The IBOutlet attribute only applies to instance variables of Objective-C
+ // classes.
+ if (ObjCIvarDecl *ID = dyn_cast<ObjCIvarDecl>(d))
+ ID->addAttr(new IBOutletAttr());
+ else
+ S.Diag(Attr.getLoc(), diag::err_attribute_iboutlet_non_ivar);
+}
+
static void HandleAliasAttr(Decl *d, const AttributeList &Attr, Sema &S) {
// check the attribute arguments.
if (Attr.getNumArgs() != 1) {
case AttributeList::AT_annotate: HandleAnnotateAttr (D, Attr, S); break;
case AttributeList::AT_noreturn: HandleNoReturnAttr (D, Attr, S); break;
case AttributeList::AT_format: HandleFormatAttr (D, Attr, S); break;
+ case AttributeList::AT_IBOutlet: HandleIBOutletAttr (D, Attr, S); break;
case AttributeList::AT_transparent_union:
HandleTransparentUnionAttr(D, Attr, S);
break;