aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorNicola Pero <nicola@brainstorm.co.uk>2004-06-01 07:40:02 +0000
committerZack Weinberg <zack@gcc.gnu.org>2004-06-01 07:40:02 +0000
commit61c627ed2c1b7184807d2101ab2d288e9ca4f39b (patch)
tree139086f8092179d1478c674d6dd17965d6d53178 /gcc
parentd314442396916fa65739d6baeb24b2f0cfc76634 (diff)
downloadgcc-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/ChangeLog21
-rw-r--r--gcc/objc/objc-act.c23
-rw-r--r--gcc/testsuite/ChangeLog7
-rw-r--r--gcc/testsuite/objc.dg/private-1.m59
-rw-r--r--gcc/testsuite/objc.dg/private-2.m54
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