119 lines · plain
1// RUN: %clang_cc1 -fsyntax-only -triple x86_64-apple-macosx10.9 -verify %s2 3#define BOXABLE __attribute__((objc_boxable))4 5typedef struct BOXABLE _NSPoint {6 int dummy;7} NSPoint;8 9typedef struct BOXABLE _NSSize {10 int dummy;11} NSSize;12 13typedef struct BOXABLE _NSRect {14 int dummy;15} NSRect;16 17typedef struct BOXABLE _CGPoint {18 int dummy;19} CGPoint;20 21typedef struct BOXABLE _CGSize {22 int dummy;23} CGSize;24 25typedef struct BOXABLE _CGRect {26 int dummy;27} CGRect;28 29typedef struct BOXABLE _NSRange {30 int dummy;31} NSRange;32 33typedef struct BOXABLE _NSEdgeInsets {34 int dummy;35} NSEdgeInsets;36 37typedef struct BOXABLE _NSEdgeInsets NSEdgeInsets;38 39typedef struct _SomeStruct {40 double d;41} SomeStruct;42 43struct BOXABLE NonTriviallyCopyable {44 double d;45 NonTriviallyCopyable() {}46 NonTriviallyCopyable(const NonTriviallyCopyable &obj) {}47};48 49void checkNSValueDiagnostic() {50 NSRect rect;51 id value = @(rect); // expected-error{{definition of class NSValue must be available to use Objective-C boxed expressions}}52}53 54@interface NSValue55+ (NSValue *)valueWithBytes:(const void *)value objCType:(const char *)type;56@end57 58int main() {59 NSPoint ns_point;60 id ns_point_value = @(ns_point);61 62 NSSize ns_size;63 id ns_size_value = @(ns_size);64 65 NSRect ns_rect;66 id ns_rect_value = @(ns_rect);67 68 CGPoint cg_point;69 id cg_point_value = @(cg_point);70 71 CGSize cg_size;72 id cg_size_value = @(cg_size);73 74 CGRect cg_rect;75 id cg_rect_value = @(cg_rect);76 77 NSRange ns_range;78 id ns_range_value = @(ns_range);79 80 NSEdgeInsets edge_insets;81 id edge_insets_object = @(edge_insets);82 83 SomeStruct s;84 id err = @(s); // expected-error{{illegal type 'SomeStruct' (aka 'struct _SomeStruct') used in a boxed expression}}85 86 NonTriviallyCopyable ntc;87 id ntcErr = @(ntc); // expected-error{{non-trivially copyable type 'NonTriviallyCopyable' cannot be used in a boxed expression}}88}89 90CGRect getRect() {91 CGRect r;92 return r;93}94 95SomeStruct getSomeStruct() {96 SomeStruct s;97 return s;98}99 100void rvalue() {101 id rv_rect = @(getRect());102 id rv_some_struct = @(getSomeStruct()); // expected-error {{illegal type 'SomeStruct' (aka 'struct _SomeStruct') used in a boxed expression}}103}104 105template <class T> id box(T value) { return @(value); } // expected-error{{non-trivially copyable type 'NonTriviallyCopyable' cannot be used in a boxed expression}}106void test_template_1(NSRect rect, NonTriviallyCopyable ntc) {107 id x = box(rect);108 id y = box(ntc); // expected-note{{in instantiation of function template specialization 'box<NonTriviallyCopyable>' requested here}}109}110 111template <unsigned i> id boxRect(NSRect rect) { return @(rect); }112template <unsigned i> id boxNTC(NonTriviallyCopyable ntc) { return @(ntc); } // expected-error{{non-trivially copyable type 'NonTriviallyCopyable' cannot be used in a boxed expression}}113void test_template_2(NSRect rect, NonTriviallyCopyable ntc) {114 id x = boxRect<0>(rect);115 id y = boxNTC<0>(ntc);116}117 118 119