| // RUN: %clang_cc1 -fsyntax-only -verify -Wno-objc-root-class %s |
| // rdar: // 8379892 |
| |
| struct X { |
| X(); |
| X(const X&); |
| ~X(); |
| |
| static int staticData; |
| int data; |
| void method(); |
| }; |
| |
| @interface A { |
| X xval; |
| } |
| |
| - (X)x; |
| - (void)setx:(X)x; |
| @end |
| |
| void f(A* a) { |
| a.x = X(); // expected-error {{no setter method 'setX:' for assignment to property}} |
| } |
| |
| struct Y : X { }; |
| |
| @interface B { |
| @private |
| Y *y; |
| } |
| - (Y)value; |
| - (void)setValue : (Y) arg; |
| @property Y value; |
| @end |
| |
| void g(B *b) { |
| b.value.data = 17; // expected-error {{not assignable}} |
| b.value.staticData = 17; |
| b.value.method(); |
| } |
| |
| @interface C |
| @end |
| |
| @implementation C |
| - (void)method:(B *)b { |
| // <rdar://problem/8985943> |
| b.operator+ = 17; // expected-error{{'operator+' is not a valid property name (accessing an object of type 'B *')}} |
| b->operator+ = 17; // expected-error{{'B' does not have a member named 'operator+'}} |
| } |
| @end |
| |
| // PR9759 |
| class Forward; |
| @interface D { // expected-note 2 {{'D' declared here}} |
| @public |
| int ivar; |
| } |
| |
| @property int property; |
| @end |
| |
| void testD(D *d) { |
| d.Forward::property = 17; // expected-error{{property access cannot be qualified with 'Forward::'}} |
| d->Forward::ivar = 12; // expected-error{{instance variable access cannot be qualified with 'Forward::'}} |
| d.D::property = 17; // expected-error{{'D' is not a class, namespace, or enumeration}} |
| d->D::ivar = 12; // expected-error{{'D' is not a class, namespace, or enumeration}} |
| } |