propert-dot-error.mm revision 5a706dc1b17f875c7fce20f1fbf9ca372be4c331
19a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org// RUN: %clang_cc1 -fsyntax-only -verify %s
23484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// rdar: // 8379892
33484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org
47c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.orgstruct X {
5196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  X();
67c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org  X(const X&);
7196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  ~X();
8196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org
9196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  static int staticData;
10196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  int data;
11196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  void method();
12c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org};
13c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org
14c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org@interface A {
15c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org  X xval;
16c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org}
17c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org
18c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org- (X)x;
19c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org- (void)setx:(X)x;
20830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org@end
21830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org
22830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.orgvoid f(A* a) {
23830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org  a.x = X(); // expected-error {{setter method is needed to assign to object using property assignment syntax}}
24830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org}
25c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org
26830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.orgstruct Y : X { };
27830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org
28af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org@interface B {
29af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org@private
30af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org  Y *y;
31af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org}
32af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org- (Y)value;
33af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org- (void)setValue : (Y) arg;
34af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org@property Y value;
35af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org@end
36af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org
37af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.orgvoid g(B *b) {
38af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org  b.value.data = 17; // expected-error {{not assignable}}
39af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org  b.value.staticData = 17;
40af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org  b.value.method();
41af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org}
42af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org
43af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org@interface C
44af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org@end
45af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org
46af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org@implementation C
47c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org- (void)method:(B *)b {
48486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  // <rdar://problem/8985943>
49c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org  b.operator+ = 17; // expected-error{{'operator+' is not a valid property name (accessing an object of type 'B *')}}
50c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org  b->operator+ = 17; // expected-error{{'B' does not have a member named 'operator+'}}
517c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org}
527c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org@end
537c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org
547c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org// PR9759
557028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.orgclass Forward;
567028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org@interface D {
577028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org@public
584efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org  int ivar;
594efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org}
604efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org
614efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org@property int property;
624efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org@end
634efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org
64830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.orgvoid testD(D *d) {
65830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org  d.Forward::property = 17; // expected-error{{property access cannot be qualified with 'Forward::'}}
66830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org  d->Forward::ivar = 12; // expected-error{{ivar access cannot be qualified with 'Forward::'}}
67830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org  d.D::property = 17; // expected-error{{expected a class or namespace}}
68830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org  d->D::ivar = 12; // expected-error{{expected a class or namespace}}
69830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org}
70830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org