diff options
Diffstat (limited to 'gcc/c-family')
-rw-r--r-- | gcc/c-family/c-attribs.c | 19 | ||||
-rw-r--r-- | gcc/c-family/c-objc.h | 2 | ||||
-rw-r--r-- | gcc/c-family/c.opt | 5 | ||||
-rw-r--r-- | gcc/c-family/stub-objc.c | 1 |
4 files changed, 26 insertions, 1 deletions
diff --git a/gcc/c-family/c-attribs.c b/gcc/c-family/c-attribs.c index f168082..24bcd70 100644 --- a/gcc/c-family/c-attribs.c +++ b/gcc/c-family/c-attribs.c @@ -158,6 +158,7 @@ static tree handle_patchable_function_entry_attribute (tree *, tree, tree, int, bool *); static tree handle_copy_attribute (tree *, tree, tree, int, bool *); static tree handle_nsobject_attribute (tree *, tree, tree, int, bool *); +static tree handle_objc_root_class_attribute (tree *, tree, tree, int, bool *); /* Helper to define attribute exclusions. */ #define ATTR_EXCL(name, function, type, variable) \ @@ -513,6 +514,8 @@ const struct attribute_spec c_common_attribute_table[] = /* Attributes used by Objective-C. */ { "NSObject", 0, 0, true, false, false, false, handle_nsobject_attribute, NULL }, + { "objc_root_class", 0, 0, true, false, false, false, + handle_objc_root_class_attribute, NULL }, { NULL, 0, 0, false, false, false, false, NULL, NULL } }; @@ -5163,6 +5166,22 @@ handle_nsobject_attribute (tree *node, tree name, tree args, return NULL_TREE; } +/* Handle a "objc_root_class" attributes; arguments as in + struct attribute_spec.handler. */ + +static tree +handle_objc_root_class_attribute (tree */*node*/, tree name, tree /*args*/, + int /*flags*/, bool *no_add_attrs) +{ + /* This has no meaning outside Objective-C. */ + if (!c_dialect_objc()) + warning (OPT_Wattributes, "%qE is only applicable to Objective-C" + " class interfaces, attribute ignored", name); + + *no_add_attrs = true; + return NULL_TREE; +} + /* Attempt to partially validate a single attribute ATTR as if it were to be applied to an entity OPER. */ diff --git a/gcc/c-family/c-objc.h b/gcc/c-family/c-objc.h index 6e96731..9414aec 100644 --- a/gcc/c-family/c-objc.h +++ b/gcc/c-family/c-objc.h @@ -124,7 +124,7 @@ extern tree objc_get_protocol_qualified_type (tree, tree); extern tree objc_get_class_reference (tree); extern tree objc_get_class_ivars (tree); extern bool objc_detect_field_duplicates (bool); -extern void objc_start_class_interface (tree, tree, tree, tree); +extern void objc_start_class_interface (tree, location_t, tree, tree, tree); extern void objc_start_category_interface (tree, tree, tree, tree); extern void objc_start_protocol (tree, tree, tree); extern void objc_continue_interface (void); diff --git a/gcc/c-family/c.opt b/gcc/c-family/c.opt index fe16357..a008363 100644 --- a/gcc/c-family/c.opt +++ b/gcc/c-family/c.opt @@ -1002,6 +1002,11 @@ Enum(cpp_normalize_level) String(id) Value(normalized_identifier_C) EnumValue Enum(cpp_normalize_level) String(nfc) Value(normalized_C) +Wobjc-root-class +ObjC ObjC++ Var(warn_objc_root_class) Warning Init(1) +Warn if a class interface has no superclass. Root classes may use an attribute +to suppress this warning. + Wold-style-cast C++ ObjC++ Var(warn_old_style_cast) Warning Warn if a C-style cast is used in a program. diff --git a/gcc/c-family/stub-objc.c b/gcc/c-family/stub-objc.c index 2f53557..26941aa 100644 --- a/gcc/c-family/stub-objc.c +++ b/gcc/c-family/stub-objc.c @@ -137,6 +137,7 @@ objc_set_method_opt (bool ARG_UNUSED (optional)) void objc_start_class_interface (tree ARG_UNUSED (name), + location_t /*name_loc*/, tree ARG_UNUSED (super), tree ARG_UNUSED (protos), tree ARG_UNUSED (attribs)) |