// 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}}