1// RUN: %clang_cc1  -fsyntax-only -triple x86_64-apple-macosx10.9 -verify %s
2
3#define BOXABLE __attribute__((objc_boxable))
4
5typedef struct BOXABLE _NSPoint {
6  int dummy;
7} NSPoint;
8
9typedef struct BOXABLE _NSSize {
10  int dummy;
11} NSSize;
12
13typedef struct BOXABLE _NSRect {
14  int dummy;
15} NSRect;
16
17typedef struct BOXABLE _CGPoint {
18  int dummy;
19} CGPoint;
20
21typedef struct BOXABLE _CGSize {
22  int dummy;
23} CGSize;
24
25typedef struct BOXABLE _CGRect {
26  int dummy;
27} CGRect;
28
29typedef struct BOXABLE _NSRange {
30  int dummy;
31} NSRange;
32
33typedef struct BOXABLE _NSEdgeInsets {
34  int dummy;
35} NSEdgeInsets;
36
37typedef struct BOXABLE _NSEdgeInsets NSEdgeInsets;
38
39typedef struct _SomeStruct {
40  double d;
41} SomeStruct;
42
43struct BOXABLE NonTriviallyCopyable {
44  double d;
45  NonTriviallyCopyable() {}
46  NonTriviallyCopyable(const NonTriviallyCopyable &obj) {}
47};
48
49void checkNSValueDiagnostic() {
50  NSRect rect;
51  id value = @(rect); // expected-error{{definition of class NSValue must be available to use Objective-C boxed expressions}}
52}
53
54@interface NSValue
55+ (NSValue *)valueWithBytes:(const void *)value objCType:(const char *)type;
56@end
57
58int main() {
59  NSPoint ns_point;
60  id ns_point_value = @(ns_point);
61
62  NSSize ns_size;
63  id ns_size_value = @(ns_size);
64
65  NSRect ns_rect;
66  id ns_rect_value = @(ns_rect);
67
68  CGPoint cg_point;
69  id cg_point_value = @(cg_point);
70
71  CGSize cg_size;
72  id cg_size_value = @(cg_size);
73
74  CGRect cg_rect;
75  id cg_rect_value = @(cg_rect);
76
77  NSRange ns_range;
78  id ns_range_value = @(ns_range);
79
80  NSEdgeInsets edge_insets;
81  id edge_insets_object = @(edge_insets);
82
83  SomeStruct s;
84  id err = @(s); // expected-error{{illegal type 'SomeStruct' (aka '_SomeStruct') used in a boxed expression}}
85
86  NonTriviallyCopyable ntc;
87  id ntcErr = @(ntc); // expected-error{{non-trivially copyable type 'NonTriviallyCopyable' cannot be used in a boxed expression}}
88}
89
90CGRect getRect() {
91  CGRect r;
92  return r;
93}
94
95SomeStruct getSomeStruct() {
96  SomeStruct s;
97  return s;
98}
99
100void rvalue() {
101  id rv_rect = @(getRect());
102  id rv_some_struct = @(getSomeStruct()); // expected-error {{illegal type 'SomeStruct' (aka '_SomeStruct') used in a boxed expression}}
103}
104
105template <class T> id box(T value) { return @(value); } // expected-error{{non-trivially copyable type 'NonTriviallyCopyable' cannot be used in a boxed expression}}
106void test_template_1(NSRect rect, NonTriviallyCopyable ntc) {
107 id x = box(rect);
108 id y = box(ntc);  // expected-note{{in instantiation of function template specialization 'box<NonTriviallyCopyable>' requested here}}
109}
110
111template <unsigned i> id boxRect(NSRect rect) { return @(rect); }
112template <unsigned i> id boxNTC(NonTriviallyCopyable ntc) { return @(ntc); }  // expected-error{{non-trivially copyable type 'NonTriviallyCopyable' cannot be used in a boxed expression}}
113void test_template_2(NSRect rect, NonTriviallyCopyable ntc) {
114 id x = boxRect<0>(rect);
115 id y = boxNTC<0>(ntc);
116}
117
118
119