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
This commit is contained in:
Nicola Pero 2004-06-01 07:40:02 +00:00 committed by Zack Weinberg
parent d314442396
commit 61c627ed2c
5 changed files with 146 additions and 18 deletions

View File

@ -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

View File

@ -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);
}

View File

@ -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.

View File

@ -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;
}

View File

@ -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