Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / clang / test / SemaObjCXX / objc-boxed-expressions-nsvalue.mm
blob3b590c46f004b1f9d8fca110bed81482ee751fe1
1 // RUN: %clang_cc1  -fsyntax-only -triple x86_64-apple-macosx10.9 -verify %s
3 #define BOXABLE __attribute__((objc_boxable))
5 typedef struct BOXABLE _NSPoint {
6   int dummy;
7 } NSPoint;
9 typedef struct BOXABLE _NSSize {
10   int dummy;
11 } NSSize;
13 typedef struct BOXABLE _NSRect {
14   int dummy;
15 } NSRect;
17 typedef struct BOXABLE _CGPoint {
18   int dummy;
19 } CGPoint;
21 typedef struct BOXABLE _CGSize {
22   int dummy;
23 } CGSize;
25 typedef struct BOXABLE _CGRect {
26   int dummy;
27 } CGRect;
29 typedef struct BOXABLE _NSRange {
30   int dummy;
31 } NSRange;
33 typedef struct BOXABLE _NSEdgeInsets {
34   int dummy;
35 } NSEdgeInsets;
37 typedef struct BOXABLE _NSEdgeInsets NSEdgeInsets;
39 typedef struct _SomeStruct {
40   double d;
41 } SomeStruct;
43 struct BOXABLE NonTriviallyCopyable {
44   double d;
45   NonTriviallyCopyable() {}
46   NonTriviallyCopyable(const NonTriviallyCopyable &obj) {}
49 void checkNSValueDiagnostic() {
50   NSRect rect;
51   id value = @(rect); // expected-error{{definition of class NSValue must be available to use Objective-C boxed expressions}}
54 @interface NSValue
55 + (NSValue *)valueWithBytes:(const void *)value objCType:(const char *)type;
56 @end
58 int main() {
59   NSPoint ns_point;
60   id ns_point_value = @(ns_point);
62   NSSize ns_size;
63   id ns_size_value = @(ns_size);
65   NSRect ns_rect;
66   id ns_rect_value = @(ns_rect);
68   CGPoint cg_point;
69   id cg_point_value = @(cg_point);
71   CGSize cg_size;
72   id cg_size_value = @(cg_size);
74   CGRect cg_rect;
75   id cg_rect_value = @(cg_rect);
77   NSRange ns_range;
78   id ns_range_value = @(ns_range);
80   NSEdgeInsets edge_insets;
81   id edge_insets_object = @(edge_insets);
83   SomeStruct s;
84   id err = @(s); // expected-error{{illegal type 'SomeStruct' (aka '_SomeStruct') used in a boxed expression}}
86   NonTriviallyCopyable ntc;
87   id ntcErr = @(ntc); // expected-error{{non-trivially copyable type 'NonTriviallyCopyable' cannot be used in a boxed expression}}
90 CGRect getRect() {
91   CGRect r;
92   return r;
95 SomeStruct getSomeStruct() {
96   SomeStruct s;
97   return s;
100 void rvalue() {
101   id rv_rect = @(getRect());
102   id rv_some_struct = @(getSomeStruct()); // expected-error {{illegal type 'SomeStruct' (aka '_SomeStruct') used in a boxed expression}}
105 template <class T> id box(T value) { return @(value); } // expected-error{{non-trivially copyable type 'NonTriviallyCopyable' cannot be used in a boxed expression}}
106 void 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}}
111 template <unsigned i> id boxRect(NSRect rect) { return @(rect); }
112 template <unsigned i> id boxNTC(NonTriviallyCopyable ntc) { return @(ntc); }  // expected-error{{non-trivially copyable type 'NonTriviallyCopyable' cannot be used in a boxed expression}}
113 void test_template_2(NSRect rect, NonTriviallyCopyable ntc) {
114  id x = boxRect<0>(rect);
115  id y = boxNTC<0>(ntc);