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