]> granicus.if.org Git - clang/commitdiff
Remove speculative fix for C++ core issue 1407, since it was resolved as NAD.
authorRichard Smith <richard-llvm@metafoo.co.uk>
Thu, 13 Sep 2012 19:55:13 +0000 (19:55 +0000)
committerRichard Smith <richard-llvm@metafoo.co.uk>
Thu, 13 Sep 2012 19:55:13 +0000 (19:55 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@163829 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaOverload.cpp
test/CXX/expr/expr.const/p3-0x.cpp
test/CodeGenCXX/mangle.cpp

index ea0f4b6937372a487e3cb7c9c183f008787ccc79..ec64665516c57465fb17d8d62a6cc5567135ea5b 100644 (file)
@@ -4798,12 +4798,6 @@ 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;
index 6ddd11bcee268024efb2eeacf28eba6fef466554..dca20c90c2e6a6e06365c800d8d425428e76b6e2 100644 (file)
@@ -73,12 +73,13 @@ 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
-// 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}}
index ba1b3bf5acd267b69d8d09b78cfe1b3e59cfa020..b384d2ea13f611a5f5fed600e73abc18c7f92cbc 100644 (file)
@@ -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 {
-  enum { __value = 1 };
+  static const bool __value = true;
 };
 
 template<bool, typename> struct __enable_if { };
@@ -231,7 +231,7 @@ template void ft8<void*>();
 // PR5796
 namespace PR5796 {
 template<typename> struct __is_scalar_type {
-  enum { __value = 0 };
+  static const bool __value = false;
 };
 
 template<bool, typename> struct __enable_if {};