Home | History | Annotate | Download | only in SemaObjC
      1 // RUN: %clang_cc1  -fsyntax-only -triple x86_64-apple-macosx10.9 -verify %s
      2 
      3 #define BOXABLE __attribute__((objc_boxable))
      4 
      5 typedef struct BOXABLE _NSPoint {
      6   int dummy;
      7 } NSPoint;
      8 
      9 typedef struct BOXABLE _NSSize {
     10   int dummy;
     11 } NSSize;
     12 
     13 typedef struct BOXABLE _NSRect {
     14   int dummy;
     15 } NSRect;
     16 
     17 typedef struct BOXABLE _CGPoint {
     18   int dummy;
     19 } CGPoint;
     20 
     21 typedef struct BOXABLE _CGSize {
     22   int dummy;
     23 } CGSize;
     24 
     25 typedef struct BOXABLE _CGRect {
     26   int dummy;
     27 } CGRect;
     28 
     29 typedef struct BOXABLE _NSRange {
     30   int dummy;
     31 } NSRange;
     32 
     33 struct _NSEdgeInsets {
     34   int dummy;
     35 };
     36 
     37 typedef struct BOXABLE _NSEdgeInsets NSEdgeInsets;
     38 
     39 typedef struct _SomeStruct {
     40   double d;
     41 } SomeStruct;
     42 
     43 typedef union BOXABLE _BoxableUnion {
     44   int dummy;
     45 } BoxableUnion;
     46 
     47 void checkNSValueDiagnostic() {
     48   NSRect rect;
     49   id value = @(rect); // expected-error{{definition of class NSValue must be available to use Objective-C boxed expressions}}
     50 }
     51 
     52 @interface NSValue
     53 + (NSValue *)valueWithBytes:(const void *)value objCType:(const char *)type;
     54 @end
     55 
     56 int main() {
     57   NSPoint ns_point;
     58   id ns_point_value = @(ns_point);
     59 
     60   NSSize ns_size;
     61   id ns_size_value = @(ns_size);
     62 
     63   NSRect ns_rect;
     64   id ns_rect_value = @(ns_rect);
     65 
     66   CGPoint cg_point;
     67   id cg_point_value = @(cg_point);
     68 
     69   CGSize cg_size;
     70   id cg_size_value = @(cg_size);
     71 
     72   CGRect cg_rect;
     73   id cg_rect_value = @(cg_rect);
     74 
     75   NSRange ns_range;
     76   id ns_range_value = @(ns_range);
     77 
     78   NSEdgeInsets edge_insets;
     79   id edge_insets_object = @(edge_insets);
     80 
     81   BoxableUnion boxable_union;
     82   id boxed_union = @(boxable_union);
     83 
     84   SomeStruct s;
     85   id err = @(s); // expected-error{{illegal type 'SomeStruct' (aka 'struct _SomeStruct') used in a boxed expression}}
     86 }
     87 
     88 CGRect getRect() {
     89   CGRect r;
     90   return r;
     91 }
     92 
     93 SomeStruct getSomeStruct() {
     94   SomeStruct s;
     95   return s;
     96 }
     97 
     98 void rvalue() {
     99   id rv_rect = @(getRect());
    100   id rv_some_struct = @(getSomeStruct()); // expected-error {{illegal type 'SomeStruct' (aka 'struct _SomeStruct') used in a boxed expression}}
    101 }
    102