diff options
Diffstat (limited to 'test/SemaObjCXX/objc-boxed-expressions-nsvalue.mm')
-rw-r--r-- | test/SemaObjCXX/objc-boxed-expressions-nsvalue.mm | 118 |
1 files changed, 118 insertions, 0 deletions
diff --git a/test/SemaObjCXX/objc-boxed-expressions-nsvalue.mm b/test/SemaObjCXX/objc-boxed-expressions-nsvalue.mm new file mode 100644 index 000000000000..375b9555fcaf --- /dev/null +++ b/test/SemaObjCXX/objc-boxed-expressions-nsvalue.mm @@ -0,0 +1,118 @@ +// 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; + +typedef struct BOXABLE _NSEdgeInsets { + int dummy; +} NSEdgeInsets; + +typedef struct BOXABLE _NSEdgeInsets NSEdgeInsets; + +typedef struct _SomeStruct { + double d; +} SomeStruct; + +struct BOXABLE NonTriviallyCopyable { + double d; + NonTriviallyCopyable() {} + NonTriviallyCopyable(const NonTriviallyCopyable &obj) {} +}; + +void checkNSValueDiagnostic() { + NSRect rect; + id value = @(rect); // expected-error{{NSValue must be available to use Objective-C boxed expressions}} +} + +@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); + + SomeStruct s; + id err = @(s); // expected-error{{illegal type 'SomeStruct' (aka '_SomeStruct') used in a boxed expression}} + + NonTriviallyCopyable ntc; + id ntcErr = @(ntc); // expected-error{{non-trivially copyable type 'NonTriviallyCopyable' cannot be 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 '_SomeStruct') used in a boxed expression}} +} + +template <class T> id box(T value) { return @(value); } // expected-error{{non-trivially copyable type 'NonTriviallyCopyable' cannot be used in a boxed expression}} +void test_template_1(NSRect rect, NonTriviallyCopyable ntc) { + id x = box(rect); + id y = box(ntc); // expected-note{{in instantiation of function template specialization 'box<NonTriviallyCopyable>' requested here}} +} + +template <unsigned i> id boxRect(NSRect rect) { return @(rect); } +template <unsigned i> id boxNTC(NonTriviallyCopyable ntc) { return @(ntc); } // expected-error{{non-trivially copyable type 'NonTriviallyCopyable' cannot be used in a boxed expression}} +void test_template_2(NSRect rect, NonTriviallyCopyable ntc) { + id x = boxRect<0>(rect); + id y = boxNTC<0>(ntc); +} + + |