1// RUN: %clang_cc1 -fsyntax-only -verify -Wattributes %s
2
3typedef long NSInteger;
4typedef unsigned long NSUInteger;
5typedef signed char BOOL;
6
7@interface NSNumber
8@end
9@interface NSNumber (NSNumberCreation)
10+ (NSNumber *)numberWithChar:(char)value;
11+ (NSNumber *)numberWithUnsignedChar:(unsigned char)value;
12+ (NSNumber *)numberWithShort:(short)value;
13+ (NSNumber *)numberWithUnsignedShort:(unsigned short)value;
14+ (NSNumber *)numberWithInt:(int)value;
15+ (NSNumber *)numberWithUnsignedInt:(unsigned int)value;
16+ (NSNumber *)numberWithLong:(long)value;
17+ (NSNumber *)numberWithUnsignedLong:(unsigned long)value;
18+ (NSNumber *)numberWithLongLong:(long long)value;
19+ (NSNumber *)numberWithUnsignedLongLong:(unsigned long long)value;
20+ (NSNumber *)numberWithFloat:(float)value;
21+ (NSNumber *)numberWithDouble:(double)value;
22+ (NSNumber *)numberWithBool:(BOOL)value;
23+ (NSNumber *)numberWithInteger:(NSInteger)value;
24+ (NSNumber *)numberWithUnsignedInteger:(NSUInteger)value;
25@end
26
27typedef struct {
28    int x, y, z;
29} point;
30
31void testStruct() {
32    point p = { 0, 0, 0 };
33    id boxed = @(p);    // expected-error {{illegal type 'point' used in a boxed expression}}
34}
35
36void testPointers() {
37    void *null = 0;
38    id boxed_null = @(null);        // expected-error {{illegal type 'void *' used in a boxed expression}}
39    int numbers[] = { 0, 1, 2 };
40    id boxed_numbers = @(numbers);  // expected-error {{illegal type 'int *' used in a boxed expression}}
41}
42
43void testInvalid() {
44  @(not_defined); // expected-error {{use of undeclared identifier 'not_defined'}}
45}
46
47enum MyEnum {
48  ME_foo
49};
50
51enum ForwE; // expected-error {{ISO C++ forbids forward references to 'enum' types}}
52
53void testEnum(void *p) {
54  enum MyEnum myen;
55  id box = @(myen);
56  box = @(ME_foo);
57  box = @(*(enum ForwE*)p); // expected-error {{incomplete type 'enum ForwE' used in a boxed expression}}
58}
59