summaryrefslogtreecommitdiff
path: root/gcc/testsuite/obj-c++.dg/local-decl-1.mm
blob: 6848572873ce961d03795342d9268605df5db505 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
/* 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 <zlaski@apple.com>.  */

/* { dg-do compile } */

#include "../objc-obj-c++-shared/Object1.h"

@interface Sprite: Object {
  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