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