objc-act.c (objc_build_struct): Save the TYPE_OBJC_INFO portion of TYPE_LANG_SPECIFIC info for all variants of...

[gcc/objc/ChangeLog]
2005-06-27  Ziemowit Laski  <zlaski@apple.com>

        * objc-act.c (objc_build_struct): Save the TYPE_OBJC_INFO
        portion of TYPE_LANG_SPECIFIC info for all variants of
        a class before calling finish_struct(), and restore
        same TYPE_OBJC_INFO afterwards.

[gcc/testsuite/ChangeLog]
2005-06-27  Ziemowit Laski  <zlaski@apple.com>

        * obj-c++.dg/proto-lossage-5.mm: New.
        * objc.dg/proto-lossage-5.m: New.

From-SVN: r101368
This commit is contained in:
Ziemowit Laski 2005-06-28 02:01:08 +00:00 committed by Ziemowit Laski
parent 0d44cd2c64
commit 2aba33dd6f
5 changed files with 72 additions and 0 deletions

View File

@ -1,3 +1,10 @@
2005-06-27 Ziemowit Laski <zlaski@apple.com>
* objc-act.c (objc_build_struct): Save the TYPE_OBJC_INFO
portion of TYPE_LANG_SPECIFIC info for all variants of
a class before calling finish_struct(), and restore
same TYPE_OBJC_INFO afterwards.
2005-06-25 Kelley Cook <kcook@gcc.gnu.org>
* all files: Update FSF address in copyright headers.

View File

@ -801,6 +801,7 @@ objc_build_struct (tree name, tree fields, tree super_name)
{
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;
if (super)
{
@ -844,8 +845,23 @@ objc_build_struct (tree name, tree fields, tree super_name)
fields = base;
}
/* NB: Calling finish_struct() may cause type TYPE_LANG_SPECIFIC fields
in all variants of this RECORD_TYPE to be clobbered, but it is therein
that we store protocol conformance info (e.g., 'NSObject <MyProtocol>').
Hence, we must squirrel away the ObjC-specific information before calling
finish_struct(), and then reinstate it afterwards. */
for (t = TYPE_NEXT_VARIANT (s); t; t = TYPE_NEXT_VARIANT (t))
objc_info
= chainon (objc_info,
build_tree_list (NULL_TREE, TYPE_OBJC_INFO (t)));
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);
/* Use TYPE_BINFO structures to point at the super class, if any. */
objc_xref_basetypes (s, super);

View File

@ -1,3 +1,8 @@
2005-06-27 Ziemowit Laski <zlaski@apple.com>
* obj-c++.dg/proto-lossage-5.mm: New.
* objc.dg/proto-lossage-5.m: New.
2005-06-27 Diego Novillo <dnovillo@redhat.com>
PR 21959

View File

@ -0,0 +1,22 @@
/* Do not lose references to forward-declared protocols. */
/* { dg-do compile } */
@class MyBaseClass;
@class MyClassThatFails;
@protocol _MyProtocol;
@interface MyClassThatFails
- (MyBaseClass<_MyProtocol> *) aMethod;
@end
@interface MyBaseClass
@end
@protocol _MyProtocol
@end
@implementation MyClassThatFails
- (MyBaseClass<_MyProtocol> *) aMethod
{
return 0;
}
@end

View File

@ -0,0 +1,22 @@
/* Do not lose references to forward-declared protocols. */
/* { dg-do compile } */
@class MyBaseClass;
@class MyClassThatFails;
@protocol _MyProtocol;
@interface MyClassThatFails
- (MyBaseClass<_MyProtocol> *) aMethod;
@end
@interface MyBaseClass
@end
@protocol _MyProtocol
@end
@implementation MyClassThatFails
- (MyBaseClass<_MyProtocol> *) aMethod
{
return 0;
}
@end