diff options
author | Nicola Pero <nicola.pero@meta-innovation.com> | 2010-11-25 19:50:13 +0000 |
---|---|---|
committer | Nicola Pero <nicola@gcc.gnu.org> | 2010-11-25 19:50:13 +0000 |
commit | 24e1ee321921eed8f9dc58cd099fd9d0ff090ce4 (patch) | |
tree | 241bfa9c44f647a87ab4413710fcd768e6e2a2fc /gcc/objc | |
parent | 92724e1d707ea2821c9a94517ba3b830f84eb296 (diff) | |
download | gcc-24e1ee321921eed8f9dc58cd099fd9d0ff090ce4.zip gcc-24e1ee321921eed8f9dc58cd099fd9d0ff090ce4.tar.gz gcc-24e1ee321921eed8f9dc58cd099fd9d0ff090ce4.tar.bz2 |
In gcc/objc/: 2010-11-25 Nicola Pero <nicola.pero@meta-innovation.com>
In gcc/objc/:
2010-11-25 Nicola Pero <nicola.pero@meta-innovation.com>
* objc-act.c (objc_build_struct): Install TYPE_OBJC_INTERFACE
after finish_struct, not before, otherwise it may be wiped out by
it. This fixes spurious warnings when a class has more than 15
instance variables.
In gcc/testsuite/:
2010-11-25 Nicola Pero <nicola.pero@meta-innovation.com>
* objc.dg/ivar-problem-1.m: New.
* obj-c++.dg/ivar-problem-1.mm: New.
From-SVN: r167151
Diffstat (limited to 'gcc/objc')
-rw-r--r-- | gcc/objc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/objc/objc-act.c | 25 |
2 files changed, 24 insertions, 8 deletions
diff --git a/gcc/objc/ChangeLog b/gcc/objc/ChangeLog index e5b453b..fb1ee6a 100644 --- a/gcc/objc/ChangeLog +++ b/gcc/objc/ChangeLog @@ -1,3 +1,10 @@ +2010-11-25 Nicola Pero <nicola.pero@meta-innovation.com> + + * objc-act.c (objc_build_struct): Install TYPE_OBJC_INTERFACE + after finish_struct, not before, otherwise it may be wiped out by + it. This fixes spurious warnings when a class has more than 15 + instance variables. + 2010-11-23 Nicola Pero <nicola.pero@meta-innovation.com> PR objc/24358 diff --git a/gcc/objc/objc-act.c b/gcc/objc/objc-act.c index 45c9441..042fa35 100644 --- a/gcc/objc/objc-act.c +++ b/gcc/objc/objc-act.c @@ -2137,10 +2137,15 @@ objc_build_struct (tree klass, 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 + /* NB: Calling finish_struct() may cause type TYPE_LANG_SPECIFIC + fields in all variants of this RECORD_TYPE to be clobbered (this + is because the C frontend stores a sorted version of the list of + fields in lang_type if it deems appropriate, and will update and + propagate that list to all variants ignoring the fact that we use + lang_type for something else and that such propagation will wipe + the objc_info away), 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)) @@ -2153,12 +2158,16 @@ objc_build_struct (tree klass, tree fields, tree super_name) VEC_safe_push (tree, heap, objc_info, TYPE_OBJC_INFO (t)); } - /* Point the struct at its related Objective-C class. */ - INIT_TYPE_OBJC_INFO (s); - TYPE_OBJC_INTERFACE (s) = klass; - s = objc_finish_struct (s, fields); + /* Point the struct at its related Objective-C class. We do this + after calling finish_struct() because otherwise finish_struct() + would wipe TYPE_OBJC_INTERFACE() out. */ + if (!TYPE_HAS_OBJC_INFO (s)) + INIT_TYPE_OBJC_INFO (s); + + TYPE_OBJC_INTERFACE (s) = klass; + for (i = 0, t = TYPE_NEXT_VARIANT (s); t; t = TYPE_NEXT_VARIANT (t), i++) { TYPE_OBJC_INFO (t) = VEC_index (tree, objc_info, i); |