xref: /aosp_15_r20/external/clang/test/SemaObjC/objc-boxed-expressions-nsvalue.m (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li// RUN: %clang_cc1  -fsyntax-only -triple x86_64-apple-macosx10.9 -verify %s
2*67e74705SXin Li
3*67e74705SXin Li#define BOXABLE __attribute__((objc_boxable))
4*67e74705SXin Li
5*67e74705SXin Litypedef struct BOXABLE _NSPoint {
6*67e74705SXin Li  int dummy;
7*67e74705SXin Li} NSPoint;
8*67e74705SXin Li
9*67e74705SXin Litypedef struct BOXABLE _NSSize {
10*67e74705SXin Li  int dummy;
11*67e74705SXin Li} NSSize;
12*67e74705SXin Li
13*67e74705SXin Litypedef struct BOXABLE _NSRect {
14*67e74705SXin Li  int dummy;
15*67e74705SXin Li} NSRect;
16*67e74705SXin Li
17*67e74705SXin Litypedef struct BOXABLE _CGPoint {
18*67e74705SXin Li  int dummy;
19*67e74705SXin Li} CGPoint;
20*67e74705SXin Li
21*67e74705SXin Litypedef struct BOXABLE _CGSize {
22*67e74705SXin Li  int dummy;
23*67e74705SXin Li} CGSize;
24*67e74705SXin Li
25*67e74705SXin Litypedef struct BOXABLE _CGRect {
26*67e74705SXin Li  int dummy;
27*67e74705SXin Li} CGRect;
28*67e74705SXin Li
29*67e74705SXin Litypedef struct BOXABLE _NSRange {
30*67e74705SXin Li  int dummy;
31*67e74705SXin Li} NSRange;
32*67e74705SXin Li
33*67e74705SXin Listruct _NSEdgeInsets {
34*67e74705SXin Li  int dummy;
35*67e74705SXin Li};
36*67e74705SXin Li
37*67e74705SXin Litypedef struct BOXABLE _NSEdgeInsets NSEdgeInsets;
38*67e74705SXin Li
39*67e74705SXin Litypedef struct _SomeStruct {
40*67e74705SXin Li  double d;
41*67e74705SXin Li} SomeStruct;
42*67e74705SXin Li
43*67e74705SXin Litypedef union BOXABLE _BoxableUnion {
44*67e74705SXin Li  int dummy;
45*67e74705SXin Li} BoxableUnion;
46*67e74705SXin Li
47*67e74705SXin Livoid checkNSValueDiagnostic() {
48*67e74705SXin Li  NSRect rect;
49*67e74705SXin Li  id value = @(rect); // expected-error{{definition of class NSValue must be available to use Objective-C boxed expressions}}
50*67e74705SXin Li}
51*67e74705SXin Li
52*67e74705SXin Li@interface NSValue
53*67e74705SXin Li+ (NSValue *)valueWithBytes:(const void *)value objCType:(const char *)type;
54*67e74705SXin Li@end
55*67e74705SXin Li
56*67e74705SXin Liint main() {
57*67e74705SXin Li  NSPoint ns_point;
58*67e74705SXin Li  id ns_point_value = @(ns_point);
59*67e74705SXin Li
60*67e74705SXin Li  NSSize ns_size;
61*67e74705SXin Li  id ns_size_value = @(ns_size);
62*67e74705SXin Li
63*67e74705SXin Li  NSRect ns_rect;
64*67e74705SXin Li  id ns_rect_value = @(ns_rect);
65*67e74705SXin Li
66*67e74705SXin Li  CGPoint cg_point;
67*67e74705SXin Li  id cg_point_value = @(cg_point);
68*67e74705SXin Li
69*67e74705SXin Li  CGSize cg_size;
70*67e74705SXin Li  id cg_size_value = @(cg_size);
71*67e74705SXin Li
72*67e74705SXin Li  CGRect cg_rect;
73*67e74705SXin Li  id cg_rect_value = @(cg_rect);
74*67e74705SXin Li
75*67e74705SXin Li  NSRange ns_range;
76*67e74705SXin Li  id ns_range_value = @(ns_range);
77*67e74705SXin Li
78*67e74705SXin Li  NSEdgeInsets edge_insets;
79*67e74705SXin Li  id edge_insets_object = @(edge_insets);
80*67e74705SXin Li
81*67e74705SXin Li  BoxableUnion boxable_union;
82*67e74705SXin Li  id boxed_union = @(boxable_union);
83*67e74705SXin Li
84*67e74705SXin Li  SomeStruct s;
85*67e74705SXin Li  id err = @(s); // expected-error{{illegal type 'SomeStruct' (aka 'struct _SomeStruct') used in a boxed expression}}
86*67e74705SXin Li}
87*67e74705SXin Li
88*67e74705SXin LiCGRect getRect() {
89*67e74705SXin Li  CGRect r;
90*67e74705SXin Li  return r;
91*67e74705SXin Li}
92*67e74705SXin Li
93*67e74705SXin LiSomeStruct getSomeStruct() {
94*67e74705SXin Li  SomeStruct s;
95*67e74705SXin Li  return s;
96*67e74705SXin Li}
97*67e74705SXin Li
98*67e74705SXin Livoid rvalue() {
99*67e74705SXin Li  id rv_rect = @(getRect());
100*67e74705SXin Li  id rv_some_struct = @(getSomeStruct()); // expected-error {{illegal type 'SomeStruct' (aka 'struct _SomeStruct') used in a boxed expression}}
101*67e74705SXin Li}
102