xref: /aosp_15_r20/external/clang/test/SemaObjCXX/propert-dot-error.mm (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li// RUN: %clang_cc1 -fsyntax-only -verify -Wno-objc-root-class %s
2*67e74705SXin Li// rdar: // 8379892
3*67e74705SXin Li
4*67e74705SXin Listruct X {
5*67e74705SXin Li  X();
6*67e74705SXin Li  X(const X&);
7*67e74705SXin Li  ~X();
8*67e74705SXin Li
9*67e74705SXin Li  static int staticData;
10*67e74705SXin Li  int data;
11*67e74705SXin Li  void method();
12*67e74705SXin Li};
13*67e74705SXin Li
14*67e74705SXin Li@interface A {
15*67e74705SXin Li  X xval;
16*67e74705SXin Li}
17*67e74705SXin Li
18*67e74705SXin Li- (X)x;
19*67e74705SXin Li- (void)setx:(X)x;
20*67e74705SXin Li@end
21*67e74705SXin Li
22*67e74705SXin Livoid f(A* a) {
23*67e74705SXin Li  a.x = X(); // expected-error {{no setter method 'setX:' for assignment to property}}
24*67e74705SXin Li}
25*67e74705SXin Li
26*67e74705SXin Listruct Y : X { };
27*67e74705SXin Li
28*67e74705SXin Li@interface B {
29*67e74705SXin Li@private
30*67e74705SXin Li  Y *y;
31*67e74705SXin Li}
32*67e74705SXin Li- (Y)value;
33*67e74705SXin Li- (void)setValue : (Y) arg;
34*67e74705SXin Li@property Y value;
35*67e74705SXin Li@end
36*67e74705SXin Li
37*67e74705SXin Livoid g(B *b) {
38*67e74705SXin Li  b.value.data = 17; // expected-error {{not assignable}}
39*67e74705SXin Li  b.value.staticData = 17;
40*67e74705SXin Li  b.value.method();
41*67e74705SXin Li}
42*67e74705SXin Li
43*67e74705SXin Li@interface C
44*67e74705SXin Li@end
45*67e74705SXin Li
46*67e74705SXin Li@implementation C
47*67e74705SXin Li- (void)method:(B *)b {
48*67e74705SXin Li  // <rdar://problem/8985943>
49*67e74705SXin Li  b.operator+ = 17; // expected-error{{'operator+' is not a valid property name (accessing an object of type 'B *')}}
50*67e74705SXin Li  b->operator+ = 17; // expected-error{{'B' does not have a member named 'operator+'}}
51*67e74705SXin Li}
52*67e74705SXin Li@end
53*67e74705SXin Li
54*67e74705SXin Li// PR9759
55*67e74705SXin Liclass Forward;
56*67e74705SXin Li@interface D { // expected-note 2 {{'D' declared here}}
57*67e74705SXin Li@public
58*67e74705SXin Li  int ivar;
59*67e74705SXin Li}
60*67e74705SXin Li
61*67e74705SXin Li@property int property;
62*67e74705SXin Li@end
63*67e74705SXin Li
64*67e74705SXin Livoid testD(D *d) {
65*67e74705SXin Li  d.Forward::property = 17; // expected-error{{property access cannot be qualified with 'Forward::'}}
66*67e74705SXin Li  d->Forward::ivar = 12; // expected-error{{instance variable access cannot be qualified with 'Forward::'}}
67*67e74705SXin Li  d.D::property = 17; // expected-error{{'D' is not a class, namespace, or enumeration}}
68*67e74705SXin Li  d->D::ivar = 12; // expected-error{{'D' is not a class, namespace, or enumeration}}
69*67e74705SXin Li}
70