From a0e71127bb2ab3450437010387edd33404590de8 Mon Sep 17 00:00:00 2001 From: Ziemowit Laski Date: Fri, 8 Jul 2005 01:53:37 +0000 Subject: [PATCH] objc-act.c (objc_build_struct): Pass in an actual @interface instead of its name... [gcc/objc/ChangeLog] 2005-07-07 Ziemowit Laski * objc-act.c (objc_build_struct): Pass in an actual @interface instead of its name, and annotate the struct created (and all existing variants thereof) with the @interface. (objc_compare_types): Treat forward-declared ObjC classes as stand-alone (root) classes for purposes of type comparisons. (build_private_template): Move some code to objc_build_struct(). [gcc/testsuite/ChangeLog] 2005-07-07 Ziemowit Laski * obj-c++.dg/proto-lossage-6.mm: New. * objc.dg/proto-lossage-6.m: New. From-SVN: r101750 --- gcc/objc/ChangeLog | 9 ++++++ gcc/objc/objc-act.c | 35 +++++++++++++++------ gcc/testsuite/ChangeLog | 5 +++ gcc/testsuite/obj-c++.dg/proto-lossage-6.mm | 17 ++++++++++ gcc/testsuite/objc.dg/proto-lossage-6.m | 18 +++++++++++ 5 files changed, 75 insertions(+), 9 deletions(-) create mode 100644 gcc/testsuite/obj-c++.dg/proto-lossage-6.mm create mode 100644 gcc/testsuite/objc.dg/proto-lossage-6.m diff --git a/gcc/objc/ChangeLog b/gcc/objc/ChangeLog index 6d7b9a4d9f1..00fa28acd66 100644 --- a/gcc/objc/ChangeLog +++ b/gcc/objc/ChangeLog @@ -1,3 +1,12 @@ +2005-07-07 Ziemowit Laski + + * objc-act.c (objc_build_struct): Pass in an actual @interface + instead of its name, and annotate the struct created (and all + existing variants thereof) with the @interface. + (objc_compare_types): Treat forward-declared ObjC classes + as stand-alone (root) classes for purposes of type comparisons. + (build_private_template): Move some code to objc_build_struct(). + 2005-07-07 Ziemowit Laski PR objc/22274 diff --git a/gcc/objc/objc-act.c b/gcc/objc/objc-act.c index 48cf7075863..35d534368de 100644 --- a/gcc/objc/objc-act.c +++ b/gcc/objc/objc-act.c @@ -794,12 +794,13 @@ objc_is_class_id (tree type) return OBJC_TYPE_NAME (type) == objc_class_id; } -/* Construct a C struct with tag NAME, a base struct with tag +/* Construct a C struct with same name as CLASS, a base struct with tag SUPER_NAME (if any), and FIELDS indicated. */ static tree -objc_build_struct (tree name, tree fields, tree super_name) +objc_build_struct (tree class, tree fields, tree super_name) { + tree name = CLASS_NAME (class); tree s = start_struct (RECORD_TYPE, name); tree super = (super_name ? xref_tag (RECORD_TYPE, super_name) : NULL_TREE); tree t, objc_info = NULL_TREE; @@ -857,15 +858,26 @@ objc_build_struct (tree name, tree fields, tree super_name) = chainon (objc_info, build_tree_list (NULL_TREE, TYPE_OBJC_INFO (t))); + /* Point the struct at its related Objective-C class. */ + INIT_TYPE_OBJC_INFO (s); + TYPE_OBJC_INTERFACE (s) = class; + s = finish_struct (s, fields, NULL_TREE); for (t = TYPE_NEXT_VARIANT (s); t; t = TYPE_NEXT_VARIANT (t), objc_info = TREE_CHAIN (objc_info)) - TYPE_OBJC_INFO (t) = TREE_VALUE (objc_info); + { + TYPE_OBJC_INFO (t) = TREE_VALUE (objc_info); + /* Replace the IDENTIFIER_NODE with an actual @interface. */ + TYPE_OBJC_INTERFACE (t) = class; + } /* Use TYPE_BINFO structures to point at the super class, if any. */ objc_xref_basetypes (s, super); + /* Mark this struct as a class template. */ + CLASS_STATIC_TEMPLATE (class) = s; + return s; } @@ -1099,6 +1111,16 @@ objc_compare_types (tree ltyp, tree rtyp, int argno, tree callee) else rcls = rproto = NULL_TREE; + /* If we could not find an @interface declaration, we must have + only seen a @class declaration; for purposes of type comparison, + treat it as a stand-alone (root) class. */ + + if (lcls && TREE_CODE (lcls) == IDENTIFIER_NODE) + lcls = NULL_TREE; + + if (rcls && TREE_CODE (rcls) == IDENTIFIER_NODE) + rcls = NULL_TREE; + /* If either type is an unqualified 'id', we're done. */ if ((!lproto && objc_is_object_id (ltyp)) || (!rproto && objc_is_object_id (rtyp))) @@ -4109,15 +4131,10 @@ build_private_template (tree class) { if (!CLASS_STATIC_TEMPLATE (class)) { - tree record = objc_build_struct (CLASS_NAME (class), + tree record = objc_build_struct (class, get_class_ivars (class, false), CLASS_SUPER_NAME (class)); - /* mark this record as class template - for class type checking */ - INIT_TYPE_OBJC_INFO (record); - TYPE_OBJC_INTERFACE (record) = class; - CLASS_STATIC_TEMPLATE (class) = record; - /* Set the TREE_USED bit for this struct, so that stab generator can emit stabs for this struct type. */ if (flag_debug_only_used_symbols && TYPE_STUB_DECL (record)) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index afafe9c45e4..394b84667a2 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -10,6 +10,11 @@ Add test cases where the shift length is greater than the array length. +2005-07-07 Ziemowit Laski + + * obj-c++.dg/proto-lossage-6.mm: New. + * objc.dg/proto-lossage-6.m: New. + 2005-07-07 Ziemowit Laski * obj-c++.dg/gnu-runtime-2.mm: Compile, do not run. diff --git a/gcc/testsuite/obj-c++.dg/proto-lossage-6.mm b/gcc/testsuite/obj-c++.dg/proto-lossage-6.mm new file mode 100644 index 00000000000..6a4552eb048 --- /dev/null +++ b/gcc/testsuite/obj-c++.dg/proto-lossage-6.mm @@ -0,0 +1,17 @@ +@class Base; +@protocol _Protocol; + +@interface ClassA { +} +-(void) func1:(Base<_Protocol> *)inTarget; +@end + +int main() +{ + ClassA* theA = 0; + Base<_Protocol>* myBase = 0; + [theA func1:myBase]; + + return 0; +} + diff --git a/gcc/testsuite/objc.dg/proto-lossage-6.m b/gcc/testsuite/objc.dg/proto-lossage-6.m new file mode 100644 index 00000000000..2b8720c3670 --- /dev/null +++ b/gcc/testsuite/objc.dg/proto-lossage-6.m @@ -0,0 +1,18 @@ +/* { dg-do compile } */ +@class Base; +@protocol _Protocol; + +@interface ClassA { +} +-(void) func1:(Base<_Protocol> *)inTarget; +@end + +int main() +{ + ClassA* theA = 0; + Base<_Protocol>* myBase = 0; + [theA func1:myBase]; + + return 0; +} + -- 2.30.2