diff options
| author | zlaski <zlaski@138bc75d-0d04-0410-961f-82ee72b054a4> | 2005-06-28 02:01:08 +0000 |
|---|---|---|
| committer | zlaski <zlaski@138bc75d-0d04-0410-961f-82ee72b054a4> | 2005-06-28 02:01:08 +0000 |
| commit | 0bee387e3c1aae76cc96f13a1b6f4180dec18e8a (patch) | |
| tree | 4dc299720e3fd440e3139ea0c208910bedcceae5 /gcc/objc/objc-act.c | |
| parent | 1f096ecf54f5eb831a4a887306d28dab381c8554 (diff) | |
| download | ppe42-gcc-0bee387e3c1aae76cc96f13a1b6f4180dec18e8a.tar.gz ppe42-gcc-0bee387e3c1aae76cc96f13a1b6f4180dec18e8a.zip | |
[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.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@101368 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/objc/objc-act.c')
| -rw-r--r-- | gcc/objc/objc-act.c | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/gcc/objc/objc-act.c b/gcc/objc/objc-act.c index 6c9018181da..35951fea145 100644 --- a/gcc/objc/objc-act.c +++ b/gcc/objc/objc-act.c @@ -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); |

