/* Test for ivar access inside of class methods. It should be allowed (with a warning), but only if no other declarations with the same name are seen. */ /* Author: Ziemowit Laski . */ /* { dg-do compile } */ #include "../objc-obj-c++-shared/TestsuiteObject.h" @interface Sprite: TestsuiteObject { int sprite, spree; } + (void)setFoo:(int)foo; + (void)setSprite:(int)sprite; - (void)setFoo:(int)foo; - (void)setSprite:(int)sprite; @end int spree = 23; @implementation Sprite + (void)setFoo:(int)foo { sprite = foo; /* { dg-warning "instance variable .sprite. accessed in class method" } */ spree = foo; } + (void)setSprite:(int)sprite { int spree; sprite = 15; spree = 17; ((Sprite *)self)->sprite = 16; /* NB: This is how one _should_ access */ ((Sprite *)self)->spree = 18; /* ivars from within class methods! */ } - (void)setFoo:(int)foo { sprite = foo; spree = foo; } - (void)setSprite:(int)sprite { int spree; sprite = 15; /* { dg-warning "local declaration of .sprite. hides instance variable" } */ self->sprite = 16; spree = 17; /* { dg-warning "local declaration of .spree. hides instance variable" } */ self->spree = 18; } @end