diff options
author | Nicola Pero <nicola@brainstorm.co.uk> | 2004-06-01 07:40:02 +0000 |
---|---|---|
committer | Zack Weinberg <zack@gcc.gnu.org> | 2004-06-01 07:40:02 +0000 |
commit | 61c627ed2c1b7184807d2101ab2d288e9ca4f39b (patch) | |
tree | 139086f8092179d1478c674d6dd17965d6d53178 /gcc | |
parent | d314442396916fa65739d6baeb24b2f0cfc76634 (diff) | |
download | gcc-61c627ed2c1b7184807d2101ab2d288e9ca4f39b.zip gcc-61c627ed2c1b7184807d2101ab2d288e9ca4f39b.tar.gz gcc-61c627ed2c1b7184807d2101ab2d288e9ca4f39b.tar.bz2 |
re PR objc/7993 (private variables cannot be shadowed in subclasses)
2004-06-01 Nicola Pero <nicola@brainstorm.co.uk>
Fix PR objc/7993:
* objc-act.c (is_private): Do not emit the 'instance variable %s
is declared private' error.
(is_public): Emit the error after calling is_private.
(lookup_objc_ivar): If the instance variable is private, return 0
- the instance variable is invisible here.
testsuite:
* objc.dg/private-1.m, objc-dg/private-2.m: New testcases.
From-SVN: r82532
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 21 | ||||
-rw-r--r-- | gcc/objc/objc-act.c | 23 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/testsuite/objc.dg/private-1.m | 59 | ||||
-rw-r--r-- | gcc/testsuite/objc.dg/private-2.m | 54 |
5 files changed, 146 insertions, 18 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 8d3b149..9e3fd3b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2004-06-01 Nicola Pero <nicola@brainstorm.co.uk> + + PR objc/7993 + * objc-act.c (is_private): Do not emit the 'instance variable %s + is declared private' error. + (is_public): Emit the error after calling is_private. + (lookup_objc_ivar): If the instance variable is private, return 0 + - the instance variable is invisible here. + 2004-06-01 Eric Botcazou <ebotcazou@libertysurf.fr> * doc/invoke.texi (-static-libgcc): Explicitly mention @@ -315,7 +324,7 @@ and the remaining even if flag_unsafe_math_optimizations is off but we are under -fno-trapping-math. (fold_relational_const): Integer modes do not honor NaNs. - + 2004-05-28 Paul Brook <paul@codesourcery.com> * config/arm/arm.c (arm_output_epilogue): Remove redundant code. @@ -475,13 +484,13 @@ calculate_local_reg_bb_info, set_up_bb_rts_numbers, rpost_cmp, modify_bb_reg_pav, calculate_reg_pav, make_accurate_live_analysis): New functions. - + 2004-05-25 Devang Patel <dpatel@apple.com> * alias.c (init_alias_analysis): Use ggc_calloc instead of xrealloc. (end_alias_analysis): Use ggc_free instead fo free. - + 2004-05-25 Andrew Pinski <pinskia@physics.uc.edu> PR target/15546 @@ -556,7 +565,7 @@ (nonzero_bits, cached_nonzero_bits, nonzero_bits1, num_sign_bit_copies, cached_num_sign_bit_copies, num_sign_bit_copies1): New, from combine.c. - * rtlhooks.c: New file. + * rtlhooks.c: New file. 2004-05-25 Svein E. Seldal <Svein.Seldal@solidas.com> @@ -564,7 +573,7 @@ to support 32-bit -mint8 mode. * doc/invoke.texi (-mint8): Added documentation for the -mint8 - option in the AVR architecture. + option in the AVR architecture. 2004-05-24 Mike Stump <mrs@apple.com> @@ -598,7 +607,7 @@ PR tree-optimization/14197 * builtins.c: Include "tree-gimple.h" - (readonly_data_expr): Use get_base_address. Make sure to call + (readonly_data_expr): Use get_base_address. Make sure to call decl_readonly_section only on trees it can handle. * tree-gimple.c (get_base_address): Accept STRING_CST and CONSTRUCTOR expressions. diff --git a/gcc/objc/objc-act.c b/gcc/objc/objc-act.c index 385360a..0707433 100644 --- a/gcc/objc/objc-act.c +++ b/gcc/objc/objc-act.c @@ -6467,15 +6467,9 @@ is_ivar (tree decl_chain, tree ident) int is_private (tree decl) { - if (TREE_PRIVATE (decl) - && ! is_ivar (CLASS_IVARS (implementation_template), DECL_NAME (decl))) - { - error ("instance variable `%s' is declared private", - IDENTIFIER_POINTER (DECL_NAME (decl))); - return 1; - } - else - return 0; + return (TREE_PRIVATE (decl) + && ! is_ivar (CLASS_IVARS (implementation_template), + DECL_NAME (decl))); } /* We have an instance variable reference;, check to see if it is public. */ @@ -6513,7 +6507,14 @@ is_public (tree expr, tree identifier) == CATEGORY_IMPLEMENTATION_TYPE)) && (CLASS_NAME (objc_implementation_context) == OBJC_TYPE_NAME (basetype)))) - return ! is_private (decl); + { + int private = is_private (decl); + + if (private) + error ("instance variable `%s' is declared private", + IDENTIFIER_POINTER (DECL_NAME (decl))); + return !private; + } /* The 2.95.2 compiler sometimes allowed C functions to access non-@public ivars. We will let this slide for now... */ @@ -9066,7 +9067,7 @@ lookup_objc_ivar (tree id) else if (objc_method_context && (decl = is_ivar (objc_ivar_chain, id))) { if (is_private (decl)) - return error_mark_node; + return 0; else return build_ivar_reference (id); } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 67b637b..0c34a57 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2004-06-01 Nicola Pero <nicola@brainstorm.co.uk> + + PR objc/7993 + * objc.dg/private-1.m, objc-dg/private-2.m: New testcases. + 2004-05-31 Mark Mitchell <mark@codesourcery.com> PR c++/15701 @@ -207,7 +212,7 @@ * gfortran.fortran-torture/execute/power.f90: Test constant integers. 2004-05-18 Andrew Pinski <pinskia@physics.uc.edu> - Jeff Law <law@redhat.com> + Jeff Law <law@redhat.com> * gcc.dg/tree-ssa/20040514-2.c: Update expected output. * gcc.dg/tree-ssa/20040518-2.c: New test. diff --git a/gcc/testsuite/objc.dg/private-1.m b/gcc/testsuite/objc.dg/private-1.m new file mode 100644 index 0000000..f4d8a52 --- /dev/null +++ b/gcc/testsuite/objc.dg/private-1.m @@ -0,0 +1,59 @@ +/* Test errors for accessing @private and @protected variables. */ +/* Author: Nicola Pero <nicola@brainstorm.co.uk>. */ +/* { dg-do compile } */ +#include <objc/objc.h> + +@interface MySuperClass +{ +@private + int private; + +@protected + int protected; + +@public + int public; +} +- (void) test; +@end + +@implementation MySuperClass +- (void) test +{ + private = 12; /* Ok */ + protected = 12; /* Ok */ + public = 12; /* Ok */ +} +@end + + +@interface MyClass : MySuperClass +@end + +@implementation MyClass +- (void) test +{ + /* Private variables simply don't exist in the subclass. */ + private = 12;/* { dg-error "undeclared" } */ + /* { dg-error "function it appears in" "" { target *-*-* } { 37 } } */ + + protected = 12; /* Ok */ + public = 12; /* Ok */ +} +@end + +int main (void) +{ + MyClass *m = nil; + + if (m != nil) + { + int access; + + access = m->private; /* { dg-error "is @private" } */ + access = m->protected; /* { dg-error "is @protected" } */ + access = m->public; /* Ok */ + } + + return 0; +} diff --git a/gcc/testsuite/objc.dg/private-2.m b/gcc/testsuite/objc.dg/private-2.m new file mode 100644 index 0000000..eff376a --- /dev/null +++ b/gcc/testsuite/objc.dg/private-2.m @@ -0,0 +1,54 @@ +/* Test warnings for shadowing instance variables. */ +/* Author: Nicola Pero <nicola@brainstorm.co.uk>. */ +/* { dg-do compile } */ +#include <objc/objc.h> + +@interface MySuperClass +{ +@private + int private; + +@protected + int protected; + +@public + int public; +} +- (void) test; +@end + +@implementation MySuperClass +- (void) test +{ + /* FIXME: I wonder if the warnings shouldn't be better generated + when the variable is declared, rather than used! */ + int private = 12; + int protected = 12; + int public = 12; + int a; + + a = private; /* { dg-warning "hides instance variable" } */ + a = protected; /* { dg-warning "hides instance variable" } */ + a = public; /* { dg-warning "hides instance variable" } */ +} +@end + + +@interface MyClass : MySuperClass +@end + +@implementation MyClass +- (void) test +{ + int private = 12; + int protected = 12; + int public = 12; + int a; + + /* The private variable can be shadowed without warnings, because + * it's invisible, and not accessible, to the subclass! */ + a = private; /* Ok */ + a = protected; /* { dg-warning "hides instance variable" } */ + a = public; /* { dg-warning "hides instance variable" } */ +} +@end |