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;
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
-// integral conversions as well as boolean conversions.
+// boolean conversions, not integral conversions, so are not permitted. See
+// core issue 1407.
template<typename T, T v> struct Val { static constexpr T value = v; };
-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'}}
+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}}
// (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}}
template int ft6<S>(const S&);
template<typename> struct __is_scalar_type {
- enum { __value = 1 };
+ static const bool __value = true;
};
template<bool, typename> struct __enable_if { };
// PR5796
namespace PR5796 {
template<typename> struct __is_scalar_type {
- enum { __value = 0 };
+ static const bool __value = false;
};
template<bool, typename> struct __enable_if {};