aboutsummaryrefslogtreecommitdiff
path: root/lib/Sema/SemaCXXCast.cpp
diff options
context:
space:
mode:
authorDouglas Gregor <dgregor@apple.com>2011-02-18 03:01:41 +0000
committerDouglas Gregor <dgregor@apple.com>2011-02-18 03:01:41 +0000
commit1e856d99c52d9e93eab48084c3aca4a59204b94b (patch)
treea40dae4dafc5ae2df7cd42c84cb6f6f5ae5710ef /lib/Sema/SemaCXXCast.cpp
parent0d3c985ad5b07121149957e5993cf1e3df26a413 (diff)
Implement C++0x [expr.static.cast]p9, which permits explicitly casting
a scoped enumeration type to an integral or floating type, properly. There was an over-eager assertion, and it was missing the floating-point case. Fixes PR9107/<rdar://problem/8937402>. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@125825 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Sema/SemaCXXCast.cpp')
-rw-r--r--lib/Sema/SemaCXXCast.cpp25
1 files changed, 15 insertions, 10 deletions
diff --git a/lib/Sema/SemaCXXCast.cpp b/lib/Sema/SemaCXXCast.cpp
index 35b7f51df1..30bb5763f2 100644
--- a/lib/Sema/SemaCXXCast.cpp
+++ b/lib/Sema/SemaCXXCast.cpp
@@ -688,18 +688,23 @@ static TryCastResult TryStaticCast(Sema &Self, Expr *&SrcExpr,
QualType SrcType = Self.Context.getCanonicalType(SrcExpr->getType());
// C++0x 5.2.9p9: A value of a scoped enumeration type can be explicitly
- // converted to an integral type.
- if (Self.getLangOptions().CPlusPlus0x && SrcType->isEnumeralType()) {
- assert(SrcType->getAs<EnumType>()->getDecl()->isScoped());
- if (DestType->isBooleanType()) {
- Kind = CK_IntegralToBoolean;
- return TC_Success;
- } else if (DestType->isIntegralType(Self.Context)) {
- Kind = CK_IntegralCast;
- return TC_Success;
+ // converted to an integral type. [...] A value of a scoped enumeration type
+ // can also be explicitly converted to a floating-point type [...].
+ if (const EnumType *Enum = SrcType->getAs<EnumType>()) {
+ if (Enum->getDecl()->isScoped()) {
+ if (DestType->isBooleanType()) {
+ Kind = CK_IntegralToBoolean;
+ return TC_Success;
+ } else if (DestType->isIntegralType(Self.Context)) {
+ Kind = CK_IntegralCast;
+ return TC_Success;
+ } else if (DestType->isRealFloatingType()) {
+ Kind = CK_IntegralToFloating;
+ return TC_Success;
+ }
}
}
-
+
// Reverse integral promotion/conversion. All such conversions are themselves
// again integral promotions or conversions and are thus already handled by
// p2 (TryDirectInitialization above).