brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.9 KiB · 57aaa62 Raw
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