diff options
-rw-r--r-- | lib/Sema/SemaOverload.cpp | 6 | ||||
-rw-r--r-- | test/CXX/expr/expr.const/p3-0x.cpp | 11 | ||||
-rw-r--r-- | test/CodeGenCXX/mangle.cpp | 4 |
3 files changed, 13 insertions, 8 deletions
diff --git a/lib/Sema/SemaOverload.cpp b/lib/Sema/SemaOverload.cpp index 4d8795ea96..14f8db6db5 100644 --- a/lib/Sema/SemaOverload.cpp +++ b/lib/Sema/SemaOverload.cpp @@ -4818,6 +4818,12 @@ static bool CheckConvertedConstantConversions(Sema &S, return true; case ICK_Boolean_Conversion: + // Conversion from an integral or unscoped enumeration type to bool is + // classified as ICK_Boolean_Conversion, but it's also an integral + // conversion, so it's permitted in a converted constant expression. + return SCS.getFromType()->isIntegralOrUnscopedEnumerationType() && + SCS.getToType(2)->isBooleanType(); + case ICK_Floating_Integral: case ICK_Complex_Real: return false; diff --git a/test/CXX/expr/expr.const/p3-0x.cpp b/test/CXX/expr/expr.const/p3-0x.cpp index dca20c90c2..6ddd11bcee 100644 --- a/test/CXX/expr/expr.const/p3-0x.cpp +++ b/test/CXX/expr/expr.const/p3-0x.cpp @@ -73,13 +73,12 @@ using Int = A<1000>; // expected-error {{template argument evaluates to 1000, wh using Int = A<-3>; // expected-error {{template argument evaluates to -3, which cannot be narrowed to type 'unsigned char'}} // Note, conversions from integral or unscoped enumeration types to bool are -// boolean conversions, not integral conversions, so are not permitted. See -// core issue 1407. +// integral conversions as well as boolean conversions. template<typename T, T v> struct Val { static constexpr T value = v; }; -static_assert(Val<bool, E1>::value == 1, ""); // expected-error {{conversion from 'E' to 'bool' is not allowed in a converted constant expression}} -static_assert(Val<bool, '\0'>::value == 0, ""); // expected-error {{conversion from 'char' to 'bool' is not allowed in a converted constant expression}} -static_assert(Val<bool, U'\1'>::value == 1, ""); // expected-error {{conversion from 'char32_t' to 'bool' is not allowed in a converted constant expression}} -static_assert(Val<bool, E5>::value == 1, ""); // expected-error {{conversion from 'E' to 'bool' is not allowed in a converted constant expression}} +static_assert(Val<bool, E1>::value == 1, ""); // ok +static_assert(Val<bool, '\0'>::value == 0, ""); // ok +static_assert(Val<bool, U'\1'>::value == 1, ""); // ok +static_assert(Val<bool, E5>::value == 1, ""); // expected-error {{5, which cannot be narrowed to type 'bool'}} // (no other conversions are permitted) using Int = A<1.0>; // expected-error {{conversion from 'double' to 'unsigned char' is not allowed in a converted constant expression}} diff --git a/test/CodeGenCXX/mangle.cpp b/test/CodeGenCXX/mangle.cpp index b384d2ea13..ba1b3bf5ac 100644 --- a/test/CodeGenCXX/mangle.cpp +++ b/test/CodeGenCXX/mangle.cpp @@ -181,7 +181,7 @@ template <typename T> typename T::U ft6(const T&) { return 0; } template int ft6<S>(const S&); template<typename> struct __is_scalar_type { - static const bool __value = true; + enum { __value = 1 }; }; template<bool, typename> struct __enable_if { }; @@ -231,7 +231,7 @@ template void ft8<void*>(); // PR5796 namespace PR5796 { template<typename> struct __is_scalar_type { - static const bool __value = false; + enum { __value = 0 }; }; template<bool, typename> struct __enable_if {}; |