Benjamin Kramer | 39ad0f0 | 2012-11-21 17:42:47 +0000 | [diff] [blame] | 1 | // RUN: %clang_cc1 %s -fsyntax-only -verify -std=c++11 |
Richard Trieu | 11cbe2a | 2011-11-07 18:40:31 +0000 | [diff] [blame] | 2 | |
| 3 | // PR11179 |
| 4 | template <short T> class Type1 {}; |
Kaelyn Uhrain | 0d3317e | 2012-06-19 00:37:47 +0000 | [diff] [blame] | 5 | template <short T> void Function1(Type1<T>& x) {} // expected-note{{candidate function [with T = -42] not viable: expects an l-value for 1st argument}} |
Richard Trieu | 11cbe2a | 2011-11-07 18:40:31 +0000 | [diff] [blame] | 6 | |
| 7 | template <unsigned short T> class Type2 {}; |
Kaelyn Uhrain | 0d3317e | 2012-06-19 00:37:47 +0000 | [diff] [blame] | 8 | template <unsigned short T> void Function2(Type2<T>& x) {} // expected-note{{candidate function [with T = 42] not viable: expects an l-value for 1st argument}} |
Richard Trieu | 11cbe2a | 2011-11-07 18:40:31 +0000 | [diff] [blame] | 9 | |
Benjamin Kramer | 39ad0f0 | 2012-11-21 17:42:47 +0000 | [diff] [blame] | 10 | enum class boolTy : bool { |
| 11 | b = 0, |
| 12 | }; |
| 13 | |
| 14 | template <boolTy T> struct Type3Helper; |
| 15 | template <> struct Type3Helper<boolTy::b> { typedef boolTy Ty; }; |
| 16 | template <boolTy T, typename Type3Helper<T>::Ty U> struct Type3 {}; |
| 17 | |
| 18 | // PR14386 |
| 19 | enum class charTy : char { |
| 20 | c = 0, |
| 21 | }; |
| 22 | |
| 23 | template <charTy T> struct Type4Helper; |
| 24 | template <> struct Type4Helper<charTy::c> { typedef charTy Ty; }; |
| 25 | template <charTy T, typename Type4Helper<T>::Ty U> struct Type4 {}; |
| 26 | |
| 27 | enum class scharTy : signed char { |
| 28 | c = 0, |
| 29 | }; |
| 30 | |
| 31 | template <scharTy T> struct Type5Helper; |
| 32 | template <> struct Type5Helper<scharTy::c> { typedef scharTy Ty; }; |
| 33 | template <scharTy T, typename Type5Helper<T>::Ty U> struct Type5 {}; |
| 34 | |
| 35 | enum class ucharTy : unsigned char { |
| 36 | c = 0, |
| 37 | }; |
| 38 | |
| 39 | template <ucharTy T> struct Type6Helper; |
| 40 | template <> struct Type6Helper<ucharTy::c> { typedef ucharTy Ty; }; |
| 41 | template <ucharTy T, typename Type6Helper<T>::Ty U> struct Type6 {}; |
| 42 | |
| 43 | enum class wcharTy : wchar_t { |
| 44 | c = 0, |
| 45 | }; |
| 46 | |
| 47 | template <wcharTy T> struct Type7Helper; |
| 48 | template <> struct Type7Helper<wcharTy::c> { typedef wcharTy Ty; }; |
| 49 | template <wcharTy T, typename Type7Helper<T>::Ty U> struct Type7 {}; |
| 50 | |
| 51 | enum class char16Ty : char16_t { |
| 52 | c = 0, |
| 53 | }; |
| 54 | |
| 55 | template <char16Ty T> struct Type8Helper; |
| 56 | template <> struct Type8Helper<char16Ty::c> { typedef char16Ty Ty; }; |
| 57 | template <char16Ty T, typename Type8Helper<T>::Ty U> struct Type8 {}; |
| 58 | |
| 59 | enum class char32Ty : char16_t { |
| 60 | c = 0, |
| 61 | }; |
| 62 | |
| 63 | template <char32Ty T> struct Type9Helper; |
| 64 | template <> struct Type9Helper<char32Ty::c> { typedef char32Ty Ty; }; |
| 65 | template <char32Ty T, typename Type9Helper<T>::Ty U> struct Type9 {}; |
| 66 | |
Richard Trieu | 11cbe2a | 2011-11-07 18:40:31 +0000 | [diff] [blame] | 67 | void 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'}} |
Benjamin Kramer | 39ad0f0 | 2012-11-21 17:42:47 +0000 | [diff] [blame] | 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 | |
Jordan Rose | 6d4f734 | 2013-02-08 22:30:27 +0000 | [diff] [blame] | 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')}} |
Richard Trieu | 11cbe2a | 2011-11-07 18:40:31 +0000 | [diff] [blame] | 79 | } |