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

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

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.
This commit is contained in:
Iain Sandoe 2020-10-24 09:48:44 +01:00
parent 7a2cc1e843
commit bb93020ff8
7 changed files with 39 additions and 0 deletions

View File

@ -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,

View File

@ -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"

View File

@ -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,

View File

@ -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 ();

View File

@ -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. */

View File

@ -0,0 +1,7 @@
/* Check that we accept the SEL typedef. */
/* { dg-additional-options "-fsyntax-only " } */
SEL aSelector;
typedef SEL MySEL;

View File

@ -0,0 +1,7 @@
/* Check that we accept the SEL typedef. */
/* { dg-additional-options "-fsyntax-only " } */
SEL aSelector;
typedef SEL MySEL;