mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-02-12 02:09:54 +08:00
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:
parent
d314442396
commit
61c627ed2c
@ -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
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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.
|
||||
|
59
gcc/testsuite/objc.dg/private-1.m
Normal file
59
gcc/testsuite/objc.dg/private-1.m
Normal 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;
|
||||
}
|
54
gcc/testsuite/objc.dg/private-2.m
Normal file
54
gcc/testsuite/objc.dg/private-2.m
Normal 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
|
Loading…
Reference in New Issue
Block a user