diff options
author | Ian Lance Taylor <iant@golang.org> | 2020-12-03 12:12:10 -0800 |
---|---|---|
committer | Ian Lance Taylor <iant@golang.org> | 2020-12-03 12:12:10 -0800 |
commit | f012991e2db06cc95f7aac8ecb74a1ac5f51f3d2 (patch) | |
tree | 582e5d7b377b6e973666a71960b28a7d11d72b07 /gcc/objc | |
parent | 8d703821c69062c0cd255787d793e44f1a95d463 (diff) | |
parent | 3089f5feef36810c625b5813370a97b4ecc841f8 (diff) | |
download | gcc-f012991e2db06cc95f7aac8ecb74a1ac5f51f3d2.zip gcc-f012991e2db06cc95f7aac8ecb74a1ac5f51f3d2.tar.gz gcc-f012991e2db06cc95f7aac8ecb74a1ac5f51f3d2.tar.bz2 |
Merge from trunk revision 3089f5feef36810c625b5813370a97b4ecc841f8
Diffstat (limited to 'gcc/objc')
-rw-r--r-- | gcc/objc/ChangeLog | 31 | ||||
-rw-r--r-- | gcc/objc/Make-lang.in | 6 | ||||
-rw-r--r-- | gcc/objc/objc-act.c | 63 | ||||
-rw-r--r-- | gcc/objc/objc-act.h | 10 |
4 files changed, 106 insertions, 4 deletions
diff --git a/gcc/objc/ChangeLog b/gcc/objc/ChangeLog index 5bc41c6..3e83a4f 100644 --- a/gcc/objc/ChangeLog +++ b/gcc/objc/ChangeLog @@ -1,3 +1,34 @@ +2020-11-20 Jakub Jelinek <jakub@redhat.com> + + PR other/97911 + * Make-lang.in (objc.serial): Change from goal to a variable. + (.PHONY): Drop objc.serial and objc.prev. + (cc1obj$(exeext)): Depend on $(objc.serial) rather than objc.serial. + +2020-11-18 Jakub Jelinek <jakub@redhat.com> + + * Make-lang.in (objc.serial): New goal. + (.PHONY): Add objc.serial objc.prev. + (cc1obj$(exeext)): Depend on objc.prev. Call LINK_PROGRESS. + +2020-11-13 Iain Sandoe <iain@sandoe.co.uk> + + PR objc/90707 + * objc-act.c (objc_prop_attr_kind_for_rid): Handle nullability. + (objc_add_property_declaration): Handle nullability attributes. + Check that these are applicable to the property type. + * objc-act.h (enum objc_property_nullability): New. + +2020-11-13 Iain Sandoe <iain@sandoe.co.uk> + + PR objc/77404 + * objc-act.c (objc_start_class_interface): Accept the location + of the class name, use it in existing diagnostic. + (start_class): Accept obj_root_class type attributes. Warn when + the interface for an implementation does not contain a super + class (unless the diagnostic is suppressed by the the command + line flag or the objc_root_class type attribute). + 2020-11-08 Iain Sandoe <iain@sandoe.co.uk> * objc-act.c (objc_prop_attr_kind_for_rid): Handle class diff --git a/gcc/objc/Make-lang.in b/gcc/objc/Make-lang.in index add1355..2edf0a9 100644 --- a/gcc/objc/Make-lang.in +++ b/gcc/objc/Make-lang.in @@ -38,6 +38,7 @@ # # Define the names for selecting Objective-C in LANGUAGES. objc: cc1obj$(exeext) +objc.serial = cc1obj$(exeext) # Tell GNU make to ignore these if they exist. .PHONY: objc @@ -62,10 +63,13 @@ cc1obj-checksum.c : build/genchecksum$(build_exeext) checksum-options \ $(BACKEND) $(LIBDEPS) checksum-options > cc1obj-checksum.c.tmp && \ $(srcdir)/../move-if-change cc1obj-checksum.c.tmp cc1obj-checksum.c -cc1obj$(exeext): $(OBJC_OBJS) $(C_AND_OBJC_OBJS) cc1obj-checksum.o $(BACKEND) $(LIBDEPS) +cc1obj$(exeext): $(OBJC_OBJS) $(C_AND_OBJC_OBJS) cc1obj-checksum.o $(BACKEND) \ + $(LIBDEPS) $(objc.prev) + @$(call LINK_PROGRESS,$(INDEX.objc),start) +$(LLINKER) $(ALL_LINKERFLAGS) $(LDFLAGS) -o $@ \ $(OBJC_OBJS) $(C_AND_OBJC_OBJS) cc1obj-checksum.o \ $(BACKEND) $(LIBS) $(BACKENDLIBS) + @$(call LINK_PROGRESS,$(INDEX.objc),end) objc.srcextra: diff --git a/gcc/objc/objc-act.c b/gcc/objc/objc-act.c index b9ed32d..2700bbe 100644 --- a/gcc/objc/objc-act.c +++ b/gcc/objc/objc-act.c @@ -571,11 +571,11 @@ lookup_protocol_in_reflist (tree rproto_list, tree lproto) } void -objc_start_class_interface (tree klass, tree super_class, +objc_start_class_interface (tree klass, location_t name_loc, tree super_class, tree protos, tree attributes) { if (flag_objc1_only && attributes) - error_at (input_location, "class attributes are not available in Objective-C 1.0"); + error_at (name_loc, "class attributes are not available in Objective-C 1.0"); objc_interface_context = objc_ivar_context @@ -825,6 +825,11 @@ objc_prop_attr_kind_for_rid (enum rid prop_rid) case RID_PROPATOMIC: return OBJC_PROPERTY_ATTR_ATOMIC; case RID_NONATOMIC: return OBJC_PROPERTY_ATTR_NONATOMIC; + case RID_NULL_UNSPECIFIED:return OBJC_PROPERTY_ATTR_NULL_UNSPECIFIED; + case RID_NULLABLE: return OBJC_PROPERTY_ATTR_NULLABLE; + case RID_NONNULL: return OBJC_PROPERTY_ATTR_NONNULL; + case RID_NULL_RESETTABLE: return OBJC_PROPERTY_ATTR_NULL_RESETTABLE; + case RID_CLASS: return OBJC_PROPERTY_ATTR_CLASS; } } @@ -995,6 +1000,27 @@ objc_add_property_declaration (location_t location, tree decl, property_nonatomic = attrs[OBJC_PROPATTR_GROUP_CLASS]->prop_kind == OBJC_PROPERTY_ATTR_CLASS; + /* Nullability specifications for the property. */ + enum objc_property_nullability property_nullability + = OBJC_PROPERTY_NULL_UNSET; + if (attrs[OBJC_PROPATTR_GROUP_NULLABLE]) + { + if (attrs[OBJC_PROPATTR_GROUP_NULLABLE]->prop_kind + == OBJC_PROPERTY_ATTR_NULL_UNSPECIFIED) + property_nullability = OBJC_PROPERTY_NULL_UNSPECIFIED; + else if (attrs[OBJC_PROPATTR_GROUP_NULLABLE]->prop_kind + == OBJC_PROPERTY_ATTR_NULLABLE) + property_nullability = OBJC_PROPERTY_NULLABLE; + else if (attrs[OBJC_PROPATTR_GROUP_NULLABLE]->prop_kind + == OBJC_PROPERTY_ATTR_NONNULL) + property_nullability = OBJC_PROPERTY_NONNULL; + else if (attrs[OBJC_PROPATTR_GROUP_NULLABLE]->prop_kind + == OBJC_PROPERTY_ATTR_NULL_RESETTABLE) + property_nullability = OBJC_PROPERTY_NULL_RESETTABLE; + else + gcc_unreachable (); + } + /* TODO: Check that the property type is an Objective-C object or a "POD". */ @@ -1272,7 +1298,8 @@ objc_add_property_declaration (location_t location, tree decl, tree property_decl = make_node (PROPERTY_DECL); /* Copy the basic information from the original decl. */ - TREE_TYPE (property_decl) = TREE_TYPE (decl); + tree p_type = TREE_TYPE (decl); + TREE_TYPE (property_decl) = p_type; DECL_SOURCE_LOCATION (property_decl) = DECL_SOURCE_LOCATION (decl); TREE_DEPRECATED (property_decl) = TREE_DEPRECATED (decl); @@ -1287,6 +1314,28 @@ objc_add_property_declaration (location_t location, tree decl, PROPERTY_IVAR_NAME (property_decl) = NULL_TREE; PROPERTY_DYNAMIC (property_decl) = 0; + /* FIXME: We seem to drop any existing DECL_ATTRIBUTES on the floor. */ + if (property_nullability != OBJC_PROPERTY_NULL_UNSET) + { + if (p_type && !POINTER_TYPE_P (p_type)) + error_at (decl_loc, "nullability specifier %qE cannot be applied to" + " non-pointer type %qT", + attrs[OBJC_PROPATTR_GROUP_NULLABLE]->name, p_type); + else if (p_type && POINTER_TYPE_P (p_type) && TREE_TYPE (p_type) + && POINTER_TYPE_P (TREE_TYPE (p_type))) + error_at (decl_loc, "nullability specifier %qE cannot be applied to" + " multi-level pointer type %qT", + attrs[OBJC_PROPATTR_GROUP_NULLABLE]->name, p_type); + else + { + tree attr_name = get_identifier ("objc_nullability"); + tree attr_value = build_int_cst (unsigned_type_node, + (unsigned)property_nullability); + tree nulla = build_tree_list (attr_name, attr_value); + DECL_ATTRIBUTES (property_decl) = nulla; + } + } + /* Remember the fact that the property was found in the @optional section in a @protocol, or not. */ if (objc_method_optional_flag) @@ -7014,6 +7063,12 @@ start_class (enum tree_code code, tree class_name, tree super_name, CLASS_SUPER_NAME (objc_implementation_context) = CLASS_SUPER_NAME (implementation_template); } + + if (!CLASS_SUPER_NAME (objc_implementation_context) + && !lookup_attribute ("objc_root_class", + TYPE_ATTRIBUTES (implementation_template))) + warning (OPT_Wobjc_root_class, "class %qE defined without" + " specifying a base class", class_name); break; case CLASS_INTERFACE_TYPE: @@ -7044,6 +7099,8 @@ start_class (enum tree_code code, tree class_name, tree super_name, TREE_DEPRECATED (klass) = 1; else if (is_attribute_p ("objc_exception", name)) CLASS_HAS_EXCEPTION_ATTR (klass) = 1; + else if (is_attribute_p ("objc_root_class", name)) + ; else if (is_attribute_p ("visibility", name)) ; else diff --git a/gcc/objc/objc-act.h b/gcc/objc/objc-act.h index 5b0433f..2fe409db 100644 --- a/gcc/objc/objc-act.h +++ b/gcc/objc/objc-act.h @@ -141,6 +141,16 @@ enum objc_property_assign_semantics { #define PROPERTY_CLASS(DECL) \ DECL_LANG_FLAG_6 (PROPERTY_DECL_CHECK (DECL)) +/* PROPERTY_NULLABILITY attributes added to the decl attributes. + effectively, __attribute__((objc_nullability(kind))), */ +enum objc_property_nullability { + OBJC_PROPERTY_NULL_UNSPECIFIED = 0, + OBJC_PROPERTY_NULLABLE, + OBJC_PROPERTY_NONNULL, + OBJC_PROPERTY_NULL_RESETTABLE, + OBJC_PROPERTY_NULL_UNSET +}; + /* PROPERTY_REF. A PROPERTY_REF represents an 'object.property' expression. It is normally used for property access, but when the Objective-C 2.0 "dot-syntax" (object.component) is used |