aboutsummaryrefslogtreecommitdiff
path: root/test/SemaObjCXX/objc-boxed-expressions-nsvalue.mm
diff options
context:
space:
mode:
Diffstat (limited to 'test/SemaObjCXX/objc-boxed-expressions-nsvalue.mm')
-rw-r--r--test/SemaObjCXX/objc-boxed-expressions-nsvalue.mm118
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);
+}
+
+