139ad0f03d53c3aae5ea8c6d0572fd63154d40e99Benjamin Kramer// RUN: %clang_cc1 %s -fsyntax-only -verify -std=c++11
211cbe2a7fb565678fca456f6bc2d4648ced3adb3Richard Trieu
311cbe2a7fb565678fca456f6bc2d4648ced3adb3Richard Trieu// PR11179
411cbe2a7fb565678fca456f6bc2d4648ced3adb3Richard Trieutemplate <short T> class Type1 {};
50d3317e0a2e0adb57ce8d075ebdcb41a3f939805Kaelyn Uhraintemplate <short T> void Function1(Type1<T>& x) {} // expected-note{{candidate function [with T = -42] not viable: expects an l-value for 1st argument}}
611cbe2a7fb565678fca456f6bc2d4648ced3adb3Richard Trieu
711cbe2a7fb565678fca456f6bc2d4648ced3adb3Richard Trieutemplate <unsigned short T> class Type2 {};
80d3317e0a2e0adb57ce8d075ebdcb41a3f939805Kaelyn Uhraintemplate <unsigned short T> void Function2(Type2<T>& x) {} // expected-note{{candidate function [with T = 42] not viable: expects an l-value for 1st argument}}
911cbe2a7fb565678fca456f6bc2d4648ced3adb3Richard Trieu
1039ad0f03d53c3aae5ea8c6d0572fd63154d40e99Benjamin Kramerenum class boolTy : bool {
1139ad0f03d53c3aae5ea8c6d0572fd63154d40e99Benjamin Kramer  b = 0,
1239ad0f03d53c3aae5ea8c6d0572fd63154d40e99Benjamin Kramer};
1339ad0f03d53c3aae5ea8c6d0572fd63154d40e99Benjamin Kramer
1439ad0f03d53c3aae5ea8c6d0572fd63154d40e99Benjamin Kramertemplate <boolTy T> struct Type3Helper;
1539ad0f03d53c3aae5ea8c6d0572fd63154d40e99Benjamin Kramertemplate <> struct Type3Helper<boolTy::b> { typedef boolTy Ty; };
1639ad0f03d53c3aae5ea8c6d0572fd63154d40e99Benjamin Kramertemplate <boolTy T, typename Type3Helper<T>::Ty U> struct Type3 {};
1739ad0f03d53c3aae5ea8c6d0572fd63154d40e99Benjamin Kramer
1839ad0f03d53c3aae5ea8c6d0572fd63154d40e99Benjamin Kramer// PR14386
1939ad0f03d53c3aae5ea8c6d0572fd63154d40e99Benjamin Kramerenum class charTy : char {
2039ad0f03d53c3aae5ea8c6d0572fd63154d40e99Benjamin Kramer  c = 0,
2139ad0f03d53c3aae5ea8c6d0572fd63154d40e99Benjamin Kramer};
2239ad0f03d53c3aae5ea8c6d0572fd63154d40e99Benjamin Kramer
2339ad0f03d53c3aae5ea8c6d0572fd63154d40e99Benjamin Kramertemplate <charTy T> struct Type4Helper;
2439ad0f03d53c3aae5ea8c6d0572fd63154d40e99Benjamin Kramertemplate <> struct Type4Helper<charTy::c> { typedef charTy Ty; };
2539ad0f03d53c3aae5ea8c6d0572fd63154d40e99Benjamin Kramertemplate <charTy T, typename Type4Helper<T>::Ty U> struct Type4 {};
2639ad0f03d53c3aae5ea8c6d0572fd63154d40e99Benjamin Kramer
2739ad0f03d53c3aae5ea8c6d0572fd63154d40e99Benjamin Kramerenum class scharTy : signed char {
2839ad0f03d53c3aae5ea8c6d0572fd63154d40e99Benjamin Kramer  c = 0,
2939ad0f03d53c3aae5ea8c6d0572fd63154d40e99Benjamin Kramer};
3039ad0f03d53c3aae5ea8c6d0572fd63154d40e99Benjamin Kramer
3139ad0f03d53c3aae5ea8c6d0572fd63154d40e99Benjamin Kramertemplate <scharTy T> struct Type5Helper;
3239ad0f03d53c3aae5ea8c6d0572fd63154d40e99Benjamin Kramertemplate <> struct Type5Helper<scharTy::c> { typedef scharTy Ty; };
3339ad0f03d53c3aae5ea8c6d0572fd63154d40e99Benjamin Kramertemplate <scharTy T, typename Type5Helper<T>::Ty U> struct Type5 {};
3439ad0f03d53c3aae5ea8c6d0572fd63154d40e99Benjamin Kramer
3539ad0f03d53c3aae5ea8c6d0572fd63154d40e99Benjamin Kramerenum class ucharTy : unsigned char {
3639ad0f03d53c3aae5ea8c6d0572fd63154d40e99Benjamin Kramer  c = 0,
3739ad0f03d53c3aae5ea8c6d0572fd63154d40e99Benjamin Kramer};
3839ad0f03d53c3aae5ea8c6d0572fd63154d40e99Benjamin Kramer
3939ad0f03d53c3aae5ea8c6d0572fd63154d40e99Benjamin Kramertemplate <ucharTy T> struct Type6Helper;
4039ad0f03d53c3aae5ea8c6d0572fd63154d40e99Benjamin Kramertemplate <> struct Type6Helper<ucharTy::c> { typedef ucharTy Ty; };
4139ad0f03d53c3aae5ea8c6d0572fd63154d40e99Benjamin Kramertemplate <ucharTy T, typename Type6Helper<T>::Ty U> struct Type6 {};
4239ad0f03d53c3aae5ea8c6d0572fd63154d40e99Benjamin Kramer
4339ad0f03d53c3aae5ea8c6d0572fd63154d40e99Benjamin Kramerenum class wcharTy : wchar_t {
4439ad0f03d53c3aae5ea8c6d0572fd63154d40e99Benjamin Kramer  c = 0,
4539ad0f03d53c3aae5ea8c6d0572fd63154d40e99Benjamin Kramer};
4639ad0f03d53c3aae5ea8c6d0572fd63154d40e99Benjamin Kramer
4739ad0f03d53c3aae5ea8c6d0572fd63154d40e99Benjamin Kramertemplate <wcharTy T> struct Type7Helper;
4839ad0f03d53c3aae5ea8c6d0572fd63154d40e99Benjamin Kramertemplate <> struct Type7Helper<wcharTy::c> { typedef wcharTy Ty; };
4939ad0f03d53c3aae5ea8c6d0572fd63154d40e99Benjamin Kramertemplate <wcharTy T, typename Type7Helper<T>::Ty U> struct Type7 {};
5039ad0f03d53c3aae5ea8c6d0572fd63154d40e99Benjamin Kramer
5139ad0f03d53c3aae5ea8c6d0572fd63154d40e99Benjamin Kramerenum class char16Ty : char16_t {
5239ad0f03d53c3aae5ea8c6d0572fd63154d40e99Benjamin Kramer  c = 0,
5339ad0f03d53c3aae5ea8c6d0572fd63154d40e99Benjamin Kramer};
5439ad0f03d53c3aae5ea8c6d0572fd63154d40e99Benjamin Kramer
5539ad0f03d53c3aae5ea8c6d0572fd63154d40e99Benjamin Kramertemplate <char16Ty T> struct Type8Helper;
5639ad0f03d53c3aae5ea8c6d0572fd63154d40e99Benjamin Kramertemplate <> struct Type8Helper<char16Ty::c> { typedef char16Ty Ty; };
5739ad0f03d53c3aae5ea8c6d0572fd63154d40e99Benjamin Kramertemplate <char16Ty T, typename Type8Helper<T>::Ty U> struct Type8 {};
5839ad0f03d53c3aae5ea8c6d0572fd63154d40e99Benjamin Kramer
5939ad0f03d53c3aae5ea8c6d0572fd63154d40e99Benjamin Kramerenum class char32Ty : char16_t {
6039ad0f03d53c3aae5ea8c6d0572fd63154d40e99Benjamin Kramer  c = 0,
6139ad0f03d53c3aae5ea8c6d0572fd63154d40e99Benjamin Kramer};
6239ad0f03d53c3aae5ea8c6d0572fd63154d40e99Benjamin Kramer
6339ad0f03d53c3aae5ea8c6d0572fd63154d40e99Benjamin Kramertemplate <char32Ty T> struct Type9Helper;
6439ad0f03d53c3aae5ea8c6d0572fd63154d40e99Benjamin Kramertemplate <> struct Type9Helper<char32Ty::c> { typedef char32Ty Ty; };
6539ad0f03d53c3aae5ea8c6d0572fd63154d40e99Benjamin Kramertemplate <char32Ty T, typename Type9Helper<T>::Ty U> struct Type9 {};
6639ad0f03d53c3aae5ea8c6d0572fd63154d40e99Benjamin Kramer
6711cbe2a7fb565678fca456f6bc2d4648ced3adb3Richard Trieuvoid Function() {
6811cbe2a7fb565678fca456f6bc2d4648ced3adb3Richard Trieu  Function1(Type1<-42>()); // expected-error{{no matching function for call to 'Function1'}}
6911cbe2a7fb565678fca456f6bc2d4648ced3adb3Richard Trieu  Function2(Type2<42>()); // expected-error{{no matching function for call to 'Function2'}}
7039ad0f03d53c3aae5ea8c6d0572fd63154d40e99Benjamin Kramer
7139ad0f03d53c3aae5ea8c6d0572fd63154d40e99Benjamin Kramer  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')}}
7239ad0f03d53c3aae5ea8c6d0572fd63154d40e99Benjamin Kramer
736d4f73498cf014b002e72368f1c80b6b0a0785f0Jordan Rose  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')}}
746d4f73498cf014b002e72368f1c80b6b0a0785f0Jordan Rose  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')}}
756d4f73498cf014b002e72368f1c80b6b0a0785f0Jordan Rose  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')}}
766d4f73498cf014b002e72368f1c80b6b0a0785f0Jordan Rose  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')}}
776d4f73498cf014b002e72368f1c80b6b0a0785f0Jordan Rose  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')}}
786d4f73498cf014b002e72368f1c80b6b0a0785f0Jordan Rose  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')}}
7911cbe2a7fb565678fca456f6bc2d4648ced3adb3Richard Trieu}
80