1// RUN: %clang_cc1 %s -fsyntax-only -verify -std=c++11 2 3// PR11179 4template <short T> class Type1 {}; 5template <short T> void Function1(Type1<T>& x) {} // expected-note{{candidate function [with T = -42] not viable: expects an l-value for 1st argument}} 6 7template <unsigned short T> class Type2 {}; 8template <unsigned short T> void Function2(Type2<T>& x) {} // expected-note{{candidate function [with T = 42] not viable: expects an l-value for 1st argument}} 9 10enum class boolTy : bool { 11 b = 0, 12}; 13 14template <boolTy T> struct Type3Helper; 15template <> struct Type3Helper<boolTy::b> { typedef boolTy Ty; }; 16template <boolTy T, typename Type3Helper<T>::Ty U> struct Type3 {}; 17 18// PR14386 19enum class charTy : char { 20 c = 0, 21}; 22 23template <charTy T> struct Type4Helper; 24template <> struct Type4Helper<charTy::c> { typedef charTy Ty; }; 25template <charTy T, typename Type4Helper<T>::Ty U> struct Type4 {}; 26 27enum class scharTy : signed char { 28 c = 0, 29}; 30 31template <scharTy T> struct Type5Helper; 32template <> struct Type5Helper<scharTy::c> { typedef scharTy Ty; }; 33template <scharTy T, typename Type5Helper<T>::Ty U> struct Type5 {}; 34 35enum class ucharTy : unsigned char { 36 c = 0, 37}; 38 39template <ucharTy T> struct Type6Helper; 40template <> struct Type6Helper<ucharTy::c> { typedef ucharTy Ty; }; 41template <ucharTy T, typename Type6Helper<T>::Ty U> struct Type6 {}; 42 43enum class wcharTy : wchar_t { 44 c = 0, 45}; 46 47template <wcharTy T> struct Type7Helper; 48template <> struct Type7Helper<wcharTy::c> { typedef wcharTy Ty; }; 49template <wcharTy T, typename Type7Helper<T>::Ty U> struct Type7 {}; 50 51enum class char16Ty : char16_t { 52 c = 0, 53}; 54 55template <char16Ty T> struct Type8Helper; 56template <> struct Type8Helper<char16Ty::c> { typedef char16Ty Ty; }; 57template <char16Ty T, typename Type8Helper<T>::Ty U> struct Type8 {}; 58 59enum class char32Ty : char16_t { 60 c = 0, 61}; 62 63template <char32Ty T> struct Type9Helper; 64template <> struct Type9Helper<char32Ty::c> { typedef char32Ty Ty; }; 65template <char32Ty T, typename Type9Helper<T>::Ty U> struct Type9 {}; 66 67void Function() { 68 Function1(Type1<-42>()); // expected-error{{no matching function for call to 'Function1'}} 69 Function2(Type2<42>()); // expected-error{{no matching function for call to 'Function2'}} 70 71 struct Type3<boolTy::b, "3"> t3; // expected-error{{value of type 'const char [2]' is not implicitly convertible to 'typename Type3Helper<(boolTy)false>::Ty' (aka 'boolTy')}} 72 73 struct Type4<charTy::c, "4"> t4; // expected-error{{value of type 'const char [2]' is not implicitly convertible to 'typename Type4Helper<(charTy)'\x00'>::Ty' (aka 'charTy')}} 74 struct Type5<scharTy::c, "5"> t5; // expected-error{{value of type 'const char [2]' is not implicitly convertible to 'typename Type5Helper<(scharTy)'\x00'>::Ty' (aka 'scharTy')}} 75 struct Type6<ucharTy::c, "6"> t6; // expected-error{{value of type 'const char [2]' is not implicitly convertible to 'typename Type6Helper<(ucharTy)'\x00'>::Ty' (aka 'ucharTy')}} 76 struct Type7<wcharTy::c, "7"> t7; // expected-error{{value of type 'const char [2]' is not implicitly convertible to 'typename Type7Helper<(wcharTy)L'\x00'>::Ty' (aka 'wcharTy')}} 77 struct Type8<char16Ty::c, "8"> t8; // expected-error{{value of type 'const char [2]' is not implicitly convertible to 'typename Type8Helper<(char16Ty)u'\x00'>::Ty' (aka 'char16Ty')}} 78 struct Type9<char32Ty::c, "9"> t9; // expected-error{{value of type 'const char [2]' is not implicitly convertible to 'typename Type9Helper<(char32Ty)u'\x00'>::Ty' (aka 'char32Ty')}} 79} 80