From 8750956c7d424b5e9daca770d49e1feeeb57584d Mon Sep 17 00:00:00 2001 From: Iain Sandoe Date: Sat, 3 Aug 2019 20:21:44 +0000 Subject: [PATCH] Objective-C, backport fix for recognition of instancetype. This addresses a number of test fails that occur for the NeXT runtime. gcc/objc/ 2019-08-03 Iain Sandoe Backport from mainline. 2019-05-18 Iain Sandoe * objc/objc-act.h (OCTI_INSTANCE_TYPE, OCTI_INSTANCETYPE_NAME): New. (objc_global_trees): Add instance type and name. (INSTANCE_TYPEDEF_NAME): New. * objc/objc-act.c (synth_module_prologue): Build decls for objc_instancetype_type and objc_instancetype_name. gcc/testsuite/ 2019-08-03 Iain Sandoe Backport from mainline. 2019-05-18 Iain Sandoe * objc.dg/instancetype-0.m: New. From-SVN: r274050 --- gcc/objc/ChangeLog | 11 ++++++++++ gcc/objc/objc-act.c | 10 ++++++++- gcc/objc/objc-act.h | 7 +++++- gcc/testsuite/ChangeLog | 7 ++++++ gcc/testsuite/objc.dg/instancetype-0.m | 30 ++++++++++++++++++++++++++ 5 files changed, 63 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/objc.dg/instancetype-0.m diff --git a/gcc/objc/ChangeLog b/gcc/objc/ChangeLog index ba075080c32e..dfd3560b505c 100644 --- a/gcc/objc/ChangeLog +++ b/gcc/objc/ChangeLog @@ -1,3 +1,14 @@ +2019-08-03 Iain Sandoe + + Backport from mainline. + 2019-05-18 Iain Sandoe + + * objc/objc-act.h (OCTI_INSTANCE_TYPE, OCTI_INSTANCETYPE_NAME): New. + (objc_global_trees): Add instance type and name. + (INSTANCE_TYPEDEF_NAME): New. + * objc/objc-act.c (synth_module_prologue): Build decls for + objc_instancetype_type and objc_instancetype_name. + 2019-05-17 Jakub Jelinek Backported from mainline diff --git a/gcc/objc/objc-act.c b/gcc/objc/objc-act.c index 5cf7205c23b8..ad5f66e9c994 100644 --- a/gcc/objc/objc-act.c +++ b/gcc/objc/objc-act.c @@ -2950,18 +2950,26 @@ synth_module_prologue (void) objc_class_reference = xref_tag (RECORD_TYPE, objc_class_id); objc_object_type = build_pointer_type (objc_object_reference); + objc_instancetype_type = build_pointer_type (objc_object_reference); objc_class_type = build_pointer_type (objc_class_reference); objc_object_name = get_identifier (OBJECT_TYPEDEF_NAME); + objc_instancetype_name = get_identifier (INSTANCE_TYPEDEF_NAME); objc_class_name = get_identifier (CLASS_TYPEDEF_NAME); - /* Declare the 'id' and 'Class' typedefs. */ + /* Declare the 'id', 'instancetype' and 'Class' typedefs. */ type = lang_hooks.decls.pushdecl (build_decl (input_location, TYPE_DECL, objc_object_name, objc_object_type)); TREE_NO_WARNING (type) = 1; + type = lang_hooks.decls.pushdecl (build_decl (input_location, + TYPE_DECL, + objc_instancetype_name, + objc_instancetype_type)); + TREE_NO_WARNING (type) = 1; + type = lang_hooks.decls.pushdecl (build_decl (input_location, TYPE_DECL, objc_class_name, diff --git a/gcc/objc/objc-act.h b/gcc/objc/objc-act.h index 5794cdf4603e..3b690432544a 100644 --- a/gcc/objc/objc-act.h +++ b/gcc/objc/objc-act.h @@ -313,6 +313,7 @@ enum objc_tree_index OCTI_SUPER_TYPE, OCTI_SEL_TYPE, OCTI_ID_TYPE, + OCTI_INSTANCE_TYPE, OCTI_CLS_TYPE, OCTI_NST_TYPE, OCTI_PROTO_TYPE, @@ -368,6 +369,7 @@ enum objc_tree_index OCTI_OBJ_ID, OCTI_CLS_ID, OCTI_ID_NAME, + OCTI_INSTANCETYPE_NAME, OCTI_CLASS_NAME, OCTI_CNST_STR_ID, OCTI_CNST_STR_TYPE, @@ -443,6 +445,7 @@ extern GTY(()) tree objc_global_trees[OCTI_MAX]; #define objc_super_type objc_global_trees[OCTI_SUPER_TYPE] #define objc_selector_type objc_global_trees[OCTI_SEL_TYPE] #define objc_object_type objc_global_trees[OCTI_ID_TYPE] +#define objc_instancetype_type objc_global_trees[OCTI_INSTANCE_TYPE] #define objc_class_type objc_global_trees[OCTI_CLS_TYPE] #define objc_instance_type objc_global_trees[OCTI_NST_TYPE] #define objc_protocol_type objc_global_trees[OCTI_PROTO_TYPE] @@ -570,7 +573,8 @@ extern GTY(()) tree objc_global_trees[OCTI_MAX]; #define objc_object_id objc_global_trees[OCTI_OBJ_ID] #define objc_class_id objc_global_trees[OCTI_CLS_ID] -#define objc_object_name objc_global_trees[OCTI_ID_NAME] +#define objc_object_name objc_global_trees[OCTI_ID_NAME] +#define objc_instancetype_name objc_global_trees[OCTI_INSTANCETYPE_NAME] #define objc_class_name objc_global_trees[OCTI_CLASS_NAME] /* Constant string classes. */ @@ -608,6 +612,7 @@ extern GTY(()) tree objc_global_trees[OCTI_MAX]; /* Reserved tag definitions. */ #define OBJECT_TYPEDEF_NAME "id" +#define INSTANCE_TYPEDEF_NAME "instancetype" #define CLASS_TYPEDEF_NAME "Class" #define TAG_OBJECT "objc_object" diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 4371fc722680..456b8b6cee61 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2019-08-03 Iain Sandoe + + Backport from mainline. + 2019-05-18 Iain Sandoe + + * objc.dg/instancetype-0.m: New. + 2019-08-02 Martin Sebor Backport from mainline diff --git a/gcc/testsuite/objc.dg/instancetype-0.m b/gcc/testsuite/objc.dg/instancetype-0.m new file mode 100644 index 000000000000..32cafdf314c3 --- /dev/null +++ b/gcc/testsuite/objc.dg/instancetype-0.m @@ -0,0 +1,30 @@ +/* Contributed by Iain Sandoe , May 2019. */ +/* { dg-do compile } */ + +/* Basic check of parsing instancetype. */ + +extern id class_createInstance (id, int); +extern id class_getSuperclass (id); + +@interface MyObject +{ + Class isa; +} ++ (instancetype)alloc; +- (instancetype)init; ++ (instancetype)initialize; ++ (instancetype)factoryMethodA; ++ (id)factoryMethodB; ++ (Class) class; ++ (Class) superclass; +@end + +@implementation MyObject ++ (instancetype)alloc { return class_createInstance (self, 0); } +- (instancetype)init { return self; } ++ (instancetype)initialize { return self; } ++ (instancetype)factoryMethodA { return [[[self class] alloc] init]; } ++ (id)factoryMethodB { return [[[self class] alloc] init]; } ++ (Class) class { return self; } ++ (Class) superclass { return class_getSuperclass (self); } +@end -- 2.47.2