From 61c627ed2c1b7184807d2101ab2d288e9ca4f39b Mon Sep 17 00:00:00 2001 From: Nicola Pero Date: Tue, 1 Jun 2004 07:40:02 +0000 Subject: [PATCH] re PR objc/7993 (private variables cannot be shadowed in subclasses) 2004-06-01 Nicola Pero 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 --- gcc/ChangeLog | 21 +++++++---- gcc/objc/objc-act.c | 23 ++++++------ gcc/testsuite/ChangeLog | 7 +++- gcc/testsuite/objc.dg/private-1.m | 59 +++++++++++++++++++++++++++++++ gcc/testsuite/objc.dg/private-2.m | 54 ++++++++++++++++++++++++++++ 5 files changed, 146 insertions(+), 18 deletions(-) create mode 100644 gcc/testsuite/objc.dg/private-1.m create mode 100644 gcc/testsuite/objc.dg/private-2.m diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 8d3b1497577..9e3fd3b5271 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2004-06-01 Nicola Pero + + 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 * 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 * 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 * 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 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 @@ -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 @@ -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 385360a28eb..07074330adf 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 67b637b3ac1..0c34a57a740 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2004-06-01 Nicola Pero + + PR objc/7993 + * objc.dg/private-1.m, objc-dg/private-2.m: New testcases. + 2004-05-31 Mark Mitchell PR c++/15701 @@ -207,7 +212,7 @@ * gfortran.fortran-torture/execute/power.f90: Test constant integers. 2004-05-18 Andrew Pinski - Jeff Law + Jeff Law * 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 00000000000..f4d8a5268ba --- /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 . */ +/* { dg-do compile } */ +#include + +@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 00000000000..eff376a0c84 --- /dev/null +++ b/gcc/testsuite/objc.dg/private-2.m @@ -0,0 +1,54 @@ +/* Test warnings for shadowing instance variables. */ +/* Author: Nicola Pero . */ +/* { dg-do compile } */ +#include + +@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 -- 2.30.2