1*67e74705SXin Li// RUN: %clang_cc1 -fsyntax-only -verify %s 2*67e74705SXin Li 3*67e74705SXin Li// Obj-C string literal expressions 4*67e74705SXin Litemplate <typename T> struct StringTest { 5*67e74705SXin Li void f() { 6*67e74705SXin Li (void)@"Hello"; 7*67e74705SXin Li } 8*67e74705SXin Li}; 9*67e74705SXin Li 10*67e74705SXin Litemplate struct StringTest<int>; 11*67e74705SXin Litemplate struct StringTest<double>; 12*67e74705SXin Li 13*67e74705SXin Li// @selector expressions 14*67e74705SXin Litemplate <typename T> struct SelectorTest { 15*67e74705SXin Li SEL f() { 16*67e74705SXin Li return @selector(multiple:arguments:); 17*67e74705SXin Li } 18*67e74705SXin Li SEL f2() { 19*67e74705SXin Li return @selector(multiple:arguments:); 20*67e74705SXin Li } 21*67e74705SXin Li}; 22*67e74705SXin Li 23*67e74705SXin Litemplate struct SelectorTest<int>; 24*67e74705SXin Litemplate struct SelectorTest<double>; 25*67e74705SXin Li 26*67e74705SXin Li// @protocol expressions 27*67e74705SXin Li@protocol P 28*67e74705SXin Li@end 29*67e74705SXin Li 30*67e74705SXin Litemplate <typename T> struct ProtocolTest { 31*67e74705SXin Li void f() { 32*67e74705SXin Li (void)@protocol(P); 33*67e74705SXin Li } 34*67e74705SXin Li}; 35*67e74705SXin Li 36*67e74705SXin Litemplate struct ProtocolTest<int>; 37*67e74705SXin Litemplate struct ProtocolTest<double>; 38*67e74705SXin Li 39*67e74705SXin Li// @encode expressions 40*67e74705SXin Litemplate <typename T> struct EncodeTest { 41*67e74705SXin Li static const char *encode(T t) { 42*67e74705SXin Li return @encode(T); 43*67e74705SXin Li } 44*67e74705SXin Li}; 45*67e74705SXin Li 46*67e74705SXin Litemplate struct EncodeTest<int>; 47*67e74705SXin Litemplate struct EncodeTest<double>; 48*67e74705SXin Litemplate struct EncodeTest<wchar_t>; 49*67e74705SXin Li 50*67e74705SXin Li// @() boxing expressions. 51*67e74705SXin Litemplate <typename T> struct BoxingTest { 52*67e74705SXin Li static id box(T value) { 53*67e74705SXin Li return @(value); // expected-error {{illegal type 'int *' used in a boxed expression}} \ 54*67e74705SXin Li // expected-error {{illegal type 'long double' used in a boxed expression}} 55*67e74705SXin Li } 56*67e74705SXin Li}; 57*67e74705SXin Li 58*67e74705SXin Li@interface NSNumber 59*67e74705SXin Li+ (NSNumber *)numberWithInt:(int)value; 60*67e74705SXin Li@end 61*67e74705SXin Li 62*67e74705SXin Li@interface NSString 63*67e74705SXin Li+ (id)stringWithUTF8String:(const char *)str; 64*67e74705SXin Li@end 65*67e74705SXin Li 66*67e74705SXin Litemplate struct BoxingTest<int>; 67*67e74705SXin Litemplate struct BoxingTest<const char *>; 68*67e74705SXin Litemplate struct BoxingTest<int *>; // expected-note {{in instantiation of member function 'BoxingTest<int *>::box' requested here}} 69*67e74705SXin Litemplate struct BoxingTest<long double>; // expected-note {{in instantiation of member function 'BoxingTest<long double>::box' requested here}} 70