2015-07-23 22:45:41 +08:00
|
|
|
// RUN: %clang_cc1 -fsyntax-only -triple x86_64-apple-macosx10.9 -verify %s
|
|
|
|
|
|
|
|
#define BOXABLE __attribute__((objc_boxable))
|
|
|
|
|
|
|
|
typedef struct BOXABLE _NSPoint {
|
|
|
|
int dummy;
|
|
|
|
} NSPoint;
|
|
|
|
|
|
|
|
typedef struct BOXABLE _NSSize {
|
|
|
|
int dummy;
|
|
|
|
} NSSize;
|
|
|
|
|
|
|
|
typedef struct BOXABLE _NSRect {
|
|
|
|
int dummy;
|
|
|
|
} NSRect;
|
|
|
|
|
|
|
|
typedef struct BOXABLE _CGPoint {
|
|
|
|
int dummy;
|
|
|
|
} CGPoint;
|
|
|
|
|
|
|
|
typedef struct BOXABLE _CGSize {
|
|
|
|
int dummy;
|
|
|
|
} CGSize;
|
|
|
|
|
|
|
|
typedef struct BOXABLE _CGRect {
|
|
|
|
int dummy;
|
|
|
|
} CGRect;
|
|
|
|
|
|
|
|
typedef struct BOXABLE _NSRange {
|
|
|
|
int dummy;
|
|
|
|
} NSRange;
|
|
|
|
|
|
|
|
struct _NSEdgeInsets {
|
|
|
|
int dummy;
|
|
|
|
};
|
|
|
|
|
|
|
|
typedef struct BOXABLE _NSEdgeInsets NSEdgeInsets;
|
|
|
|
|
|
|
|
typedef struct _SomeStruct {
|
|
|
|
double d;
|
|
|
|
} SomeStruct;
|
|
|
|
|
|
|
|
typedef union BOXABLE _BoxableUnion {
|
|
|
|
int dummy;
|
|
|
|
} BoxableUnion;
|
|
|
|
|
|
|
|
void checkNSValueDiagnostic() {
|
|
|
|
NSRect rect;
|
2015-07-24 13:09:40 +08:00
|
|
|
id value = @(rect); // expected-error{{definition of class NSValue must be available to use Objective-C boxed expressions}}
|
2015-07-23 22:45:41 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
@interface NSValue
|
|
|
|
+ (NSValue *)valueWithBytes:(const void *)value objCType:(const char *)type;
|
|
|
|
@end
|
|
|
|
|
|
|
|
int main() {
|
|
|
|
NSPoint ns_point;
|
|
|
|
id ns_point_value = @(ns_point);
|
|
|
|
|
|
|
|
NSSize ns_size;
|
|
|
|
id ns_size_value = @(ns_size);
|
|
|
|
|
|
|
|
NSRect ns_rect;
|
|
|
|
id ns_rect_value = @(ns_rect);
|
|
|
|
|
|
|
|
CGPoint cg_point;
|
|
|
|
id cg_point_value = @(cg_point);
|
|
|
|
|
|
|
|
CGSize cg_size;
|
|
|
|
id cg_size_value = @(cg_size);
|
|
|
|
|
|
|
|
CGRect cg_rect;
|
|
|
|
id cg_rect_value = @(cg_rect);
|
|
|
|
|
|
|
|
NSRange ns_range;
|
|
|
|
id ns_range_value = @(ns_range);
|
|
|
|
|
|
|
|
NSEdgeInsets edge_insets;
|
|
|
|
id edge_insets_object = @(edge_insets);
|
|
|
|
|
|
|
|
BoxableUnion boxable_union;
|
|
|
|
id boxed_union = @(boxable_union);
|
|
|
|
|
|
|
|
SomeStruct s;
|
|
|
|
id err = @(s); // expected-error{{illegal type 'SomeStruct' (aka 'struct _SomeStruct') used in a boxed expression}}
|
|
|
|
}
|
|
|
|
|
|
|
|
CGRect getRect() {
|
|
|
|
CGRect r;
|
|
|
|
return r;
|
|
|
|
}
|
|
|
|
|
|
|
|
SomeStruct getSomeStruct() {
|
|
|
|
SomeStruct s;
|
|
|
|
return s;
|
|
|
|
}
|
|
|
|
|
|
|
|
void rvalue() {
|
|
|
|
id rv_rect = @(getRect());
|
|
|
|
id rv_some_struct = @(getSomeStruct()); // expected-error {{illegal type 'SomeStruct' (aka 'struct _SomeStruct') used in a boxed expression}}
|
|
|
|
}
|