diff mbox series

[pushed] Objective-C : Implement SEL as a built-in typedef.

Message ID 04A92747-F4E9-4A52-A5C6-FAB76A6FC170@sandoe.co.uk
State New
Headers show
Series [pushed] Objective-C : Implement SEL as a built-in typedef. | expand

Commit Message

Iain Sandoe Nov. 1, 2020, 8:31 p.m. UTC
Hi

The reference implementation for Objective-C provides the SEL
typedef (although it is also available from <objc/objc.h>).

tested on x86_64-darwin, x86_64-linux-gnu
pushed
thanks
Iain

gcc/objc/ChangeLog:

	* objc-act.c (synth_module_prologue): Get the SEL identifier.
	* objc-act.h (enum objc_tree_index): Add OCTI_SEL_NAME.
	(objc_selector_name): New.
	(SEL_TYPEDEF_NAME): New.
	* objc-gnu-runtime-abi-01.c
	(gnu_runtime_01_initialize): Initialize SEL typedef.
	* objc-next-runtime-abi-01.c
	(next_runtime_01_initialize): Likewise.
	* objc-next-runtime-abi-02.c

gcc/testsuite/ChangeLog:

	* obj-c++.dg/SEL-typedef.mm: New test.
	* objc.dg/SEL-typedef.m: New test.
---
 gcc/objc/objc-act.c                     | 1 +
 gcc/objc/objc-act.h                     | 3 +++
 gcc/objc/objc-gnu-runtime-abi-01.c      | 7 +++++++
 gcc/objc/objc-next-runtime-abi-01.c     | 7 +++++++
 gcc/objc/objc-next-runtime-abi-02.c     | 7 +++++++
 gcc/testsuite/obj-c++.dg/SEL-typedef.mm | 7 +++++++
 gcc/testsuite/objc.dg/SEL-typedef.m     | 7 +++++++
 7 files changed, 39 insertions(+)
 create mode 100644 gcc/testsuite/obj-c++.dg/SEL-typedef.mm
 create mode 100644 gcc/testsuite/objc.dg/SEL-typedef.m
diff mbox series

Patch

diff --git a/gcc/objc/objc-act.c b/gcc/objc/objc-act.c
index 31a2cf3753f..0393bc44500 100644
--- a/gcc/objc/objc-act.c
+++ b/gcc/objc/objc-act.c
@@ -2954,6 +2954,7 @@  synth_module_prologue (void)
   objc_object_name = get_identifier (OBJECT_TYPEDEF_NAME);
   objc_instancetype_name = get_identifier (INSTANCE_TYPEDEF_NAME);
   objc_class_name = get_identifier (CLASS_TYPEDEF_NAME);
+  objc_selector_name = get_identifier (SEL_TYPEDEF_NAME);
 
   /* Declare the 'id', 'instancetype' and 'Class' typedefs.  */
   type = lang_hooks.decls.pushdecl (build_decl (input_location,
diff --git a/gcc/objc/objc-act.h b/gcc/objc/objc-act.h
index 913e152fdeb..db71b6a265e 100644
--- a/gcc/objc/objc-act.h
+++ b/gcc/objc/objc-act.h
@@ -371,6 +371,7 @@  enum objc_tree_index
     OCTI_ID_NAME,
     OCTI_INSTANCETYPE_NAME,
     OCTI_CLASS_NAME,
+    OCTI_SEL_NAME,
     OCTI_CNST_STR_ID,
     OCTI_CNST_STR_TYPE,
     OCTI_CNST_STR_GLOB_ID,
@@ -576,6 +577,7 @@  extern GTY(()) tree objc_global_trees[OCTI_MAX];
 #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]
+#define objc_selector_name	objc_global_trees[OCTI_SEL_NAME]
 
 /* Constant string classes.  */
 #define constant_string_id	objc_global_trees[OCTI_CNST_STR_ID]
@@ -614,6 +616,7 @@  extern GTY(()) tree objc_global_trees[OCTI_MAX];
 #define OBJECT_TYPEDEF_NAME		"id"
 #define INSTANCE_TYPEDEF_NAME		"instancetype"
 #define CLASS_TYPEDEF_NAME		"Class"
+#define SEL_TYPEDEF_NAME		"SEL"
 
 #define TAG_OBJECT			"objc_object"
 #define TAG_CLASS			"objc_class"
diff --git a/gcc/objc/objc-gnu-runtime-abi-01.c b/gcc/objc/objc-gnu-runtime-abi-01.c
index 25c0e01e157..ac9a8626f40 100644
--- a/gcc/objc/objc-gnu-runtime-abi-01.c
+++ b/gcc/objc/objc-gnu-runtime-abi-01.c
@@ -208,6 +208,13 @@  static void gnu_runtime_01_initialize (void)
   type = build_qualified_type (type, TYPE_QUAL_CONST);
   objc_selector_type = build_pointer_type (type);
 
+  /* SEL typedef.  */
+  type = lang_hooks.decls.pushdecl (build_decl (input_location,
+						TYPE_DECL,
+						objc_selector_name,
+						objc_selector_type));
+  TREE_NO_WARNING (type) = 1;
+
   /* typedef id (*IMP)(id, SEL, ...); */
   ftype = build_varargs_function_type_list (objc_object_type,
 					    objc_object_type,
diff --git a/gcc/objc/objc-next-runtime-abi-01.c b/gcc/objc/objc-next-runtime-abi-01.c
index 233d89e75b5..7fc449bab41 100644
--- a/gcc/objc/objc-next-runtime-abi-01.c
+++ b/gcc/objc/objc-next-runtime-abi-01.c
@@ -277,6 +277,13 @@  static void next_runtime_01_initialize (void)
   objc_selector_type = build_pointer_type (xref_tag (RECORD_TYPE,
 					   get_identifier (TAG_SELECTOR)));
 
+  /* SEL typedef.  */
+  type = lang_hooks.decls.pushdecl (build_decl (input_location,
+						TYPE_DECL,
+						objc_selector_name,
+						objc_selector_type));
+  TREE_NO_WARNING (type) = 1;
+
   build_v1_class_template ();
   build_super_template ();
   build_v1_protocol_template ();
diff --git a/gcc/objc/objc-next-runtime-abi-02.c b/gcc/objc/objc-next-runtime-abi-02.c
index d7812ffc981..f3c285a937b 100644
--- a/gcc/objc/objc-next-runtime-abi-02.c
+++ b/gcc/objc/objc-next-runtime-abi-02.c
@@ -374,6 +374,13 @@  static void next_runtime_02_initialize (void)
   objc_selector_type = build_pointer_type (xref_tag (RECORD_TYPE,
 					   get_identifier (TAG_SELECTOR)));
 
+  /* SEL typedef.  */
+  type = lang_hooks.decls.pushdecl (build_decl (input_location,
+						TYPE_DECL,
+						objc_selector_name,
+						objc_selector_type));
+  TREE_NO_WARNING (type) = 1;
+
   /* IMP : id (*) (id, _message_ref_t*, ...)
      SUPER_IMP : id (*) ( super_t*, _super_message_ref_t*, ...)
      objc_v2_selector_type.  */
diff --git a/gcc/testsuite/obj-c++.dg/SEL-typedef.mm b/gcc/testsuite/obj-c++.dg/SEL-typedef.mm
new file mode 100644
index 00000000000..2ece1fd46cd
--- /dev/null
+++ b/gcc/testsuite/obj-c++.dg/SEL-typedef.mm
@@ -0,0 +1,7 @@ 
+/* Check that we accept the SEL typedef.  */
+/*  { dg-additional-options "-fsyntax-only " } */
+
+SEL aSelector;
+
+typedef SEL MySEL;
+
diff --git a/gcc/testsuite/objc.dg/SEL-typedef.m b/gcc/testsuite/objc.dg/SEL-typedef.m
new file mode 100644
index 00000000000..2ece1fd46cd
--- /dev/null
+++ b/gcc/testsuite/objc.dg/SEL-typedef.m
@@ -0,0 +1,7 @@ 
+/* Check that we accept the SEL typedef.  */
+/*  { dg-additional-options "-fsyntax-only " } */
+
+SEL aSelector;
+
+typedef SEL MySEL;
+