blob: 3b590c46f004b1f9d8fca110bed81482ee751fe1 [file] [log] [blame]
// 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{{definition of class 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);
}