From 3d3ddcec70df5aeee4fc41ba5f55ba1a25716be0 Mon Sep 17 00:00:00 2001 From: Benjamin Kramer Date: Wed, 21 Nov 2012 17:42:47 +0000 Subject: SemaCXX: an enumeral type can be of character or boolean type in a C++11 enum class. Make sure we create a literal of the right type. Fixes PR14386. llvm-svn: 168441 --- clang/test/Misc/integer-literal-printing.cpp | 68 +++++++++++++++++++++++++++- 1 file changed, 67 insertions(+), 1 deletion(-) (limited to 'clang/test/Misc/integer-literal-printing.cpp') diff --git a/clang/test/Misc/integer-literal-printing.cpp b/clang/test/Misc/integer-literal-printing.cpp index 4085d606d2a..8b0b1fc7f26 100644 --- a/clang/test/Misc/integer-literal-printing.cpp +++ b/clang/test/Misc/integer-literal-printing.cpp @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 %s -fsyntax-only -verify +// RUN: %clang_cc1 %s -fsyntax-only -verify -std=c++11 // PR11179 template class Type1 {}; @@ -7,7 +7,73 @@ template void Function1(Type1& x) {} // expected-note{{candidate fu template class Type2 {}; template void Function2(Type2& x) {} // expected-note{{candidate function [with T = 42] not viable: expects an l-value for 1st argument}} +enum class boolTy : bool { + b = 0, +}; + +template struct Type3Helper; +template <> struct Type3Helper { typedef boolTy Ty; }; +template ::Ty U> struct Type3 {}; + +// PR14386 +enum class charTy : char { + c = 0, +}; + +template struct Type4Helper; +template <> struct Type4Helper { typedef charTy Ty; }; +template ::Ty U> struct Type4 {}; + +enum class scharTy : signed char { + c = 0, +}; + +template struct Type5Helper; +template <> struct Type5Helper { typedef scharTy Ty; }; +template ::Ty U> struct Type5 {}; + +enum class ucharTy : unsigned char { + c = 0, +}; + +template struct Type6Helper; +template <> struct Type6Helper { typedef ucharTy Ty; }; +template ::Ty U> struct Type6 {}; + +enum class wcharTy : wchar_t { + c = 0, +}; + +template struct Type7Helper; +template <> struct Type7Helper { typedef wcharTy Ty; }; +template ::Ty U> struct Type7 {}; + +enum class char16Ty : char16_t { + c = 0, +}; + +template struct Type8Helper; +template <> struct Type8Helper { typedef char16Ty Ty; }; +template ::Ty U> struct Type8 {}; + +enum class char32Ty : char16_t { + c = 0, +}; + +template struct Type9Helper; +template <> struct Type9Helper { typedef char32Ty Ty; }; +template ::Ty U> struct Type9 {}; + void Function() { Function1(Type1<-42>()); // expected-error{{no matching function for call to 'Function1'}} Function2(Type2<42>()); // expected-error{{no matching function for call to 'Function2'}} + + struct Type3 t3; // expected-error{{value of type 'const char [2]' is not implicitly convertible to 'typename Type3Helper<(boolTy)false>::Ty' (aka 'boolTy')}} + + struct Type4 t4; // expected-error{{value of type 'const char [2]' is not implicitly convertible to 'typename Type4Helper<(charTy)'\x0'>::Ty' (aka 'charTy')}} + struct Type5 t5; // expected-error{{value of type 'const char [2]' is not implicitly convertible to 'typename Type5Helper<(scharTy)'\x0'>::Ty' (aka 'scharTy')}} + struct Type6 t6; // expected-error{{value of type 'const char [2]' is not implicitly convertible to 'typename Type6Helper<(ucharTy)'\x0'>::Ty' (aka 'ucharTy')}} + struct Type7 t7; // expected-error{{value of type 'const char [2]' is not implicitly convertible to 'typename Type7Helper<(wcharTy)L'\x0'>::Ty' (aka 'wcharTy')}} + struct Type8 t8; // expected-error{{value of type 'const char [2]' is not implicitly convertible to 'typename Type8Helper<(char16Ty)u'\x0'>::Ty' (aka 'char16Ty')}} + struct Type9 t9; // expected-error{{value of type 'const char [2]' is not implicitly convertible to 'typename Type9Helper<(char32Ty)u'\x0'>::Ty' (aka 'char32Ty')}} } -- cgit v1.2.3