aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Smith <richard-llvm@metafoo.co.uk>2012-09-13 22:00:12 +0000
committerRichard Smith <richard-llvm@metafoo.co.uk>2012-09-13 22:00:12 +0000
commit2bcb984df975c75130f2320c935fae1143c2a5cc (patch)
tree70b18535704a74758b7562bb17aa484af2bc8389
parent71074fdf40a8f5b53810712102b58c27efc30759 (diff)
Revert r163829. The world (or libstdc++, at least) is not ready.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@163846 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/Sema/SemaOverload.cpp6
-rw-r--r--test/CXX/expr/expr.const/p3-0x.cpp11
-rw-r--r--test/CodeGenCXX/mangle.cpp4
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 {};