| // RUN: %clang_cc1 -fsyntax-only -verify %s |
| |
| // Obj-C string literal expressions |
| template <typename T> struct StringTest { |
| void f() { |
| (void)@"Hello"; |
| } |
| }; |
| |
| template struct StringTest<int>; |
| template struct StringTest<double>; |
| |
| // @selector expressions |
| template <typename T> struct SelectorTest { |
| SEL f() { |
| return @selector(multiple:arguments:); |
| } |
| SEL f2() { |
| return @selector(multiple:arguments:); |
| } |
| }; |
| |
| template struct SelectorTest<int>; |
| template struct SelectorTest<double>; |
| |
| // @protocol expressions |
| @protocol P |
| @end |
| |
| template <typename T> struct ProtocolTest { |
| void f() { |
| (void)@protocol(P); |
| } |
| }; |
| |
| template struct ProtocolTest<int>; |
| template struct ProtocolTest<double>; |
| |
| // @encode expressions |
| template <typename T> struct EncodeTest { |
| static const char *encode(T t) { |
| return @encode(T); |
| } |
| }; |
| |
| template struct EncodeTest<int>; |
| template struct EncodeTest<double>; |
| template struct EncodeTest<wchar_t>; |
| |
| // @() boxing expressions. |
| template <typename T> struct BoxingTest { |
| static id box(T value) { |
| return @(value); // expected-error {{Illegal type 'int *' used in a boxed expression}} \ |
| // expected-error {{Illegal type 'long double' used in a boxed expression}} |
| } |
| }; |
| |
| @interface NSNumber |
| + (NSNumber *)numberWithInt:(int)value; |
| @end |
| |
| @interface NSString |
| + (id)stringWithUTF8String:(const char *)str; |
| @end |
| |
| template struct BoxingTest<int>; |
| template struct BoxingTest<const char *>; |
| template struct BoxingTest<int *>; // expected-note {{in instantiation of member function 'BoxingTest<int *>::box' requested here}} |
| template struct BoxingTest<long double>; // expected-note {{in instantiation of member function 'BoxingTest<long double>::box' requested here}} |