119 lines
2.9 KiB
Plaintext
119 lines
2.9 KiB
Plaintext
|
// 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);
|
||
|
}
|
||
|
|
||
|
|