xref: /aosp_15_r20/external/clang/test/SemaObjCXX/objc-boxed-expressions-nsvalue.mm (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 Litypedef struct BOXABLE _NSEdgeInsets {
34*67e74705SXin Li  int dummy;
35*67e74705SXin Li} NSEdgeInsets;
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 Listruct BOXABLE NonTriviallyCopyable {
44*67e74705SXin Li  double d;
45*67e74705SXin Li  NonTriviallyCopyable() {}
46*67e74705SXin Li  NonTriviallyCopyable(const NonTriviallyCopyable &obj) {}
47*67e74705SXin Li};
48*67e74705SXin Li
49*67e74705SXin Livoid checkNSValueDiagnostic() {
50*67e74705SXin Li  NSRect rect;
51*67e74705SXin Li  id value = @(rect); // expected-error{{definition of class NSValue must be available to use Objective-C boxed expressions}}
52*67e74705SXin Li}
53*67e74705SXin Li
54*67e74705SXin Li@interface NSValue
55*67e74705SXin Li+ (NSValue *)valueWithBytes:(const void *)value objCType:(const char *)type;
56*67e74705SXin Li@end
57*67e74705SXin Li
58*67e74705SXin Liint main() {
59*67e74705SXin Li  NSPoint ns_point;
60*67e74705SXin Li  id ns_point_value = @(ns_point);
61*67e74705SXin Li
62*67e74705SXin Li  NSSize ns_size;
63*67e74705SXin Li  id ns_size_value = @(ns_size);
64*67e74705SXin Li
65*67e74705SXin Li  NSRect ns_rect;
66*67e74705SXin Li  id ns_rect_value = @(ns_rect);
67*67e74705SXin Li
68*67e74705SXin Li  CGPoint cg_point;
69*67e74705SXin Li  id cg_point_value = @(cg_point);
70*67e74705SXin Li
71*67e74705SXin Li  CGSize cg_size;
72*67e74705SXin Li  id cg_size_value = @(cg_size);
73*67e74705SXin Li
74*67e74705SXin Li  CGRect cg_rect;
75*67e74705SXin Li  id cg_rect_value = @(cg_rect);
76*67e74705SXin Li
77*67e74705SXin Li  NSRange ns_range;
78*67e74705SXin Li  id ns_range_value = @(ns_range);
79*67e74705SXin Li
80*67e74705SXin Li  NSEdgeInsets edge_insets;
81*67e74705SXin Li  id edge_insets_object = @(edge_insets);
82*67e74705SXin Li
83*67e74705SXin Li  SomeStruct s;
84*67e74705SXin Li  id err = @(s); // expected-error{{illegal type 'SomeStruct' (aka '_SomeStruct') used in a boxed expression}}
85*67e74705SXin Li
86*67e74705SXin Li  NonTriviallyCopyable ntc;
87*67e74705SXin Li  id ntcErr = @(ntc); // expected-error{{non-trivially copyable type 'NonTriviallyCopyable' cannot be used in a boxed expression}}
88*67e74705SXin Li}
89*67e74705SXin Li
90*67e74705SXin LiCGRect getRect() {
91*67e74705SXin Li  CGRect r;
92*67e74705SXin Li  return r;
93*67e74705SXin Li}
94*67e74705SXin Li
95*67e74705SXin LiSomeStruct getSomeStruct() {
96*67e74705SXin Li  SomeStruct s;
97*67e74705SXin Li  return s;
98*67e74705SXin Li}
99*67e74705SXin Li
100*67e74705SXin Livoid rvalue() {
101*67e74705SXin Li  id rv_rect = @(getRect());
102*67e74705SXin Li  id rv_some_struct = @(getSomeStruct()); // expected-error {{illegal type 'SomeStruct' (aka '_SomeStruct') used in a boxed expression}}
103*67e74705SXin Li}
104*67e74705SXin Li
105*67e74705SXin Litemplate <class T> id box(T value) { return @(value); } // expected-error{{non-trivially copyable type 'NonTriviallyCopyable' cannot be used in a boxed expression}}
106*67e74705SXin Livoid test_template_1(NSRect rect, NonTriviallyCopyable ntc) {
107*67e74705SXin Li id x = box(rect);
108*67e74705SXin Li id y = box(ntc);  // expected-note{{in instantiation of function template specialization 'box<NonTriviallyCopyable>' requested here}}
109*67e74705SXin Li}
110*67e74705SXin Li
111*67e74705SXin Litemplate <unsigned i> id boxRect(NSRect rect) { return @(rect); }
112*67e74705SXin Litemplate <unsigned i> id boxNTC(NonTriviallyCopyable ntc) { return @(ntc); }  // expected-error{{non-trivially copyable type 'NonTriviallyCopyable' cannot be used in a boxed expression}}
113*67e74705SXin Livoid test_template_2(NSRect rect, NonTriviallyCopyable ntc) {
114*67e74705SXin Li id x = boxRect<0>(rect);
115*67e74705SXin Li id y = boxNTC<0>(ntc);
116*67e74705SXin Li}
117*67e74705SXin Li
118*67e74705SXin Li
119