aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/objc/ChangeLog9
-rw-r--r--gcc/objc/objc-act.c35
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/obj-c++.dg/proto-lossage-6.mm17
-rw-r--r--gcc/testsuite/objc.dg/proto-lossage-6.m18
5 files changed, 75 insertions, 9 deletions
diff --git a/gcc/objc/ChangeLog b/gcc/objc/ChangeLog
index 6d7b9a4..00fa28a 100644
--- a/gcc/objc/ChangeLog
+++ b/gcc/objc/ChangeLog
@@ -1,5 +1,14 @@
2005-07-07 Ziemowit Laski <zlaski@apple.com>
+ * 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 <zlaski@apple.com>
+
PR objc/22274
* objc-act.c (objc_build_string_object): For GNU-style constants,
use the @interface type rather than the built-in type.
diff --git a/gcc/objc/objc-act.c b/gcc/objc/objc-act.c
index 48cf707..35d5343 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 afafe9c..394b846 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -12,6 +12,11 @@
2005-07-07 Ziemowit Laski <zlaski@apple.com>
+ * obj-c++.dg/proto-lossage-6.mm: New.
+ * objc.dg/proto-lossage-6.m: New.
+
+2005-07-07 Ziemowit Laski <zlaski@apple.com>
+
* obj-c++.dg/gnu-runtime-2.mm: Compile, do not run.
* objc.dg/gnu-runtime-2.m: Likewise.
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 0000000..6a4552e
--- /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 0000000..2b8720c
--- /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;
+}
+