More Objective-C 2.0 @property/@synthesize fixes
Nicola Pero
nicola.pero@meta-innovation.com
Sat Nov 13 18:06:00 GMT 2010
This new ObjC/ObjC++ patch contains another group of @property/@synthesize type fixes and improvements:
* it removes an incorrect warning when 'assign' is used in a @property declaration with 'Class <MyProtocol>'.
* it allows the type of an instance variable for a @synthesized property to be "more specialized"
than the type of the property, if the property is read-only.
* it detects and rejects attempts to declare @properties of type array or which are bit-fields,
which are invalid.
* it allows a bit-field instance variable to be used by @synthesize. The runtime getter/setter helpers
do not work with bit-field instance variables though, so I added explicit checks that the @property was
'nonatomic' and 'assign' to make sure that direct variable access (which works fine with bit-field variables)
could be used when generating the accessors. I doubt bit-fields would be used much with properties;
it's nice to have them for completeness though.
* it tidies up some warnings and errors. It's sometimes hard to decide what should be a warning and
what should be an error and I changed my mind a few times. Anyway, in the end I'm leaving most of the
errors and warnings as they are, with two exceptions: if a property is declared readonly, and a getter
is specified at the same time, I made that into an error because it does seem very inconsistent and
the compiler can't guess what is meant; error recovery (ie, ignoring one of the two) would have to kick
in and that seems to be an error situation. Vice versa, if a @property is re-declared in a subclass with
different attributes, I changed these to be warnings as opposed to errors because we can compile everything
fine and there may be reasons why it does not matter and everything will actually work (eg, maybe one
of the properties is never actually used; I suppose it is also possible that all property accesses are done
using accurate casts to make sure the right property is picked up). We still warn and you can't really turn
off the warnings, which is still quite heavy, but we don't refuse to compile any more.
Testcases for all of the changes above are included. I also added a couple of testcases testing properties
of type 'enum' and of other types, just to make sure there are no surprises. I also figured out that most of
the ObjC++ testsuite issues I had go away if you use dg-warning instead of dg-message to match things like
"note: originally specified here". I updated the relevant ObjC++ testcases and was able to enable them so
we have a better ObjC++ testsuite coverage.
Ok to commit to trunk ?
Thanks
PS: It's all starting to be in good shape. The main key remaining problems to work on are:
* ObjC 2.0 dot-syntax accessors don't work in quite a few cases (object.property++, object.property1 = object.property2 = x etc)
* @optional + @property does not work
* the checks that user-generated setters/getters have the right signature are missing
I guess I am a few patches away from finishing (even if I felt "a few patches away" for the past few weeks (if not months),
but now it seems I may really be) :-)
In gcc/objc/:
2010-11-13 Nicola Pero <nicola.pero@meta-innovation.com>
* objc-act.c (objc_add_property_declaration): Check that the decl
we received from the parser is a FIELD_DECL; reject array and
bitfield properties. Convert the warning when a property is
readonly and a setter is specified into an error. Convert errors
when a property declaration does not match a property declaration
in a superclass into warnings.
(objc_add_synthesize_declaration_for_property): Use
DECL_BIT_FIELD_TYPE to determine the type of an instance variable
if it is a bitfield. Throw an error if we are asked to synthesize
setters/getters for a bitfield instance variable but the property
is not appropriate - it must be assign and nonatomic. If the
property is readonly, allow the instance variable type to be a
specialization of the property type.
(objc_type_valid_for_messaging): Fixed returning 'false' for a
Class qualified with a protocol when the 'accept_classes' argument
is 'false'.
In gcc/testsuite/:
2010-11-13 Nicola Pero <nicola.pero@meta-innovation.com>
* objc.dg/property/at-property-21.m: New.
* objc.dg/property/at-property-22.m: New.
* objc.dg/property/at-property-23.m: New.
* objc.dg/property/synthesize-9.m: New.
* objc.dg/property/synthesize-10.m: New.
* objc.dg/property/synthesize-11.m: New.
* obj-c++.dg/property/at-property-21.mm: New.
* obj-c++.dg/property/at-property-22.mm: New.
* obj-c++.dg/property/at-property-23.mm: New.
* obj-c++.dg/property/synthesize-9.mm: New.
* obj-c++.dg/property/synthesize-10.mm: New.
* obj-c++.dg/property/synthesize-11.mm: New.
* objc.dg/property/at-property-4.m: Updated to match new compiler
where some errors have been converted into warnings and vice versa.
* objc.dg/property/at-property-16.m: Same change.
* objc.dg/property/at-property-18.m: Same change.
* objc.dg/property/property-neg-5.m: Same change.
* obj-c++.dg/property/at-property-4.mm: Same change.
* obj-c++.dg/property/at-property-16.mm: Same change.
* obj-c++.dg/property/at-property-18.mm: Same change.
* obj-c++.dg/property/property-neg-5.mm: Same change.
* obj-c++.dg/property/dynamic-2.mm: Enable tests that were
commented out because of testsuite problems; I found out that
using dg-warning instead of dg-message gets them to work.
* obj-c++.dg/property/property-neg-3.mm: Same change.
* obj-c++.dg/property/synthesize-6.mm: Same change.
* obj-c++.dg/property/at-property-5.mm: Same change.
* obj-c++.dg/property/at-property-14.mm: Same change.
* obj-c++.dg/property/at-property-18.mm: Same change.
* obj-c++.dg/property/at-property-16.mm: Same change (in this file,
some tests still do not work due to some other testsuite issue).
-------------- next part --------------
An embedded and charset-unspecified text was scrubbed...
Name: patch.txt
URL: <http://gcc.gnu.org/pipermail/gcc-patches/attachments/20101113/724f0262/attachment.txt>
More information about the Gcc-patches
mailing list