1/* Test for ivar access inside of class methods. It should be allowed 2 (with a warning), but only if no other declarations with the same 3 name are seen. */ 4/* Author: Ziemowit Laski <zlaski@apple.com>. */ 5 6/* { dg-do compile } */ 7 8#include "../objc-obj-c++-shared/TestsuiteObject.h" 9 10@interface Sprite: TestsuiteObject { 11 int sprite, spree; 12} 13+ (void)setFoo:(int)foo; 14+ (void)setSprite:(int)sprite; 15- (void)setFoo:(int)foo; 16- (void)setSprite:(int)sprite; 17@end 18 19int spree = 23; 20 21@implementation Sprite 22+ (void)setFoo:(int)foo { 23 sprite = foo; /* { dg-warning "instance variable .sprite. accessed in class method" } */ 24 spree = foo; 25} 26+ (void)setSprite:(int)sprite { 27 int spree; 28 sprite = 15; 29 spree = 17; 30 ((Sprite *)self)->sprite = 16; /* NB: This is how one _should_ access */ 31 ((Sprite *)self)->spree = 18; /* ivars from within class methods! */ 32} 33- (void)setFoo:(int)foo { 34 sprite = foo; 35 spree = foo; 36} 37- (void)setSprite:(int)sprite { 38 int spree; 39 sprite = 15; /* { dg-warning "local declaration of .sprite. hides instance variable" } */ 40 self->sprite = 16; 41 spree = 17; /* { dg-warning "local declaration of .spree. hides instance variable" } */ 42 self->spree = 18; 43} 44@end 45