xref: /aosp_15_r20/external/clang/test/SemaObjC/conditional-expr-3.m (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li// RUN: %clang_cc1 -fsyntax-only -verify %s
2*67e74705SXin Li
3*67e74705SXin Li@protocol P0
4*67e74705SXin Li@end
5*67e74705SXin Li@protocol P1
6*67e74705SXin Li@end
7*67e74705SXin Li@protocol P2
8*67e74705SXin Li@end
9*67e74705SXin Li
10*67e74705SXin Li@interface A <P0>
11*67e74705SXin Li@end
12*67e74705SXin Li
13*67e74705SXin Li@interface B : A
14*67e74705SXin Li@end
15*67e74705SXin Li
16*67e74705SXin Livoid bar(id x);
17*67e74705SXin Livoid barP0(id<P0> x);
18*67e74705SXin Livoid barP1(id<P1> x);
19*67e74705SXin Livoid barP2(id<P2> x);
20*67e74705SXin Li
21*67e74705SXin Livoid f0(A *a) {
22*67e74705SXin Li  id l = a;
23*67e74705SXin Li}
24*67e74705SXin Li
25*67e74705SXin Livoid f1(id x, A *a) {
26*67e74705SXin Li  id<P0> l = a;
27*67e74705SXin Li}
28*67e74705SXin Li
29*67e74705SXin Livoid f2(id<P1> x) {
30*67e74705SXin Li  id<P0> l = x; // expected-warning {{initializing 'id<P0>' with an expression of incompatible type 'id<P1>'}}
31*67e74705SXin Li}
32*67e74705SXin Li
33*67e74705SXin Livoid f3(A *a) {
34*67e74705SXin Li  id<P1> l = a; // expected-warning {{initializing 'id<P1>' with an expression of incompatible type 'A *'}}
35*67e74705SXin Li}
36*67e74705SXin Li
37*67e74705SXin Livoid f4(int cond, id x, A *a) {
38*67e74705SXin Li  bar(cond ? x : a);
39*67e74705SXin Li}
40*67e74705SXin Li
41*67e74705SXin Livoid f5(int cond, A *a, B *b) {
42*67e74705SXin Li  bar(cond ? a : b);
43*67e74705SXin Li}
44*67e74705SXin Li
45*67e74705SXin Livoid f6(int cond, id x, A *a) {
46*67e74705SXin Li  bar(cond ? (id<P0, P1>) x : a);
47*67e74705SXin Li}
48*67e74705SXin Li
49*67e74705SXin Livoid f7(int cond, id x, A *a) {
50*67e74705SXin Li  bar(cond ? a : (id<P0, P1>) x);
51*67e74705SXin Li}
52*67e74705SXin Li
53*67e74705SXin Livoid f8(int cond, id<P0,P1> x0, id<P0,P2> x1) {
54*67e74705SXin Li  barP0(cond ? x0 : x1); // expected-warning {{incompatible operand types ('id<P0,P1>' and 'id<P0,P2>')}}
55*67e74705SXin Li}
56*67e74705SXin Li
57*67e74705SXin Livoid f9(int cond, id<P0,P1> x0, id<P0,P2> x1) {
58*67e74705SXin Li  barP1(cond ? x0 : x1); // expected-warning {{incompatible operand types ('id<P0,P1>' and 'id<P0,P2>')}}
59*67e74705SXin Li}
60*67e74705SXin Li
61*67e74705SXin Livoid f10(int cond, id<P0,P1> x0, id<P0,P2> x1) {
62*67e74705SXin Li  barP2(cond ? x0 : x1); // expected-warning {{incompatible operand types ('id<P0,P1>' and 'id<P0,P2>')}}
63*67e74705SXin Li}
64*67e74705SXin Li
65*67e74705SXin Liint f11(int cond, A* a, B* b) {
66*67e74705SXin Li  return (cond? b : a)->x; // expected-error{{'A' does not have a member named 'x'}}
67*67e74705SXin Li}
68