From a10ce2f8eda6b4be3ffc432102b558a4cd055fb0 Mon Sep 17 00:00:00 2001 From: Geoffrey Keating Date: Thu, 24 Mar 2005 23:33:56 +0000 Subject: [PATCH] Index: cp/ChangeLog 2005-03-24 Geoffrey Keating * typeck.c (build_static_cast_1): Allow scalar_cast between any integral, floating, or enumeration type. Index: testsuite/ChangeLog 2005-03-24 Geoffrey Keating * g++.dg/expr/cast3.C: New. From-SVN: r97019 --- gcc/cp/ChangeLog | 5 +++++ gcc/cp/typeck.c | 16 +++++++++------- gcc/testsuite/ChangeLog | 4 ++++ gcc/testsuite/g++.dg/expr/cast3.C | 22 ++++++++++++++++++++++ 4 files changed, 40 insertions(+), 7 deletions(-) create mode 100644 gcc/testsuite/g++.dg/expr/cast3.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index ae435c1a5cf1..d7697372ecdf 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2005-03-24 Geoffrey Keating + + * typeck.c (build_static_cast_1): Allow scalar_cast between + any integral, floating, or enumeration type. + 2005-03-24 Steven Bosscher * typeck.c (comptypes): First determine if the types are compatible diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c index e2cb1f8bb104..a3bf1c0281f7 100644 --- a/gcc/cp/typeck.c +++ b/gcc/cp/typeck.c @@ -4624,13 +4624,15 @@ build_static_cast_1 (tree type, tree expr, bool c_cast_p, promotions, floating point promotion, integral conversions, floating point conversions, floating-integral conversions, pointer conversions, and pointer to member conversions. */ - if ((ARITHMETIC_TYPE_P (type) && ARITHMETIC_TYPE_P (intype)) - /* DR 128 - - A value of integral _or enumeration_ type can be explicitly - converted to an enumeration type. */ - || (INTEGRAL_OR_ENUMERATION_TYPE_P (type) - && INTEGRAL_OR_ENUMERATION_TYPE_P (intype))) + /* DR 128 + + A value of integral _or enumeration_ type can be explicitly + converted to an enumeration type. */ + /* The effect of all that is that any conversion between any two + types which are integral, floating, or enumeration types can be + performed. */ + if ((INTEGRAL_TYPE_P (type) || SCALAR_FLOAT_TYPE_P (type)) + && (INTEGRAL_TYPE_P (intype) || SCALAR_FLOAT_TYPE_P (intype))) { expr = ocp_convert (type, expr, CONV_C_CAST, LOOKUP_NORMAL); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 260a212c9165..0fe028909af1 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2005-03-24 Geoffrey Keating + + * g++.dg/expr/cast3.C: New. + 2005-03-24 David Edelsohn * gcc.c-torture/execute/20020720-1.x: XFAIL for all powerpc and diff --git a/gcc/testsuite/g++.dg/expr/cast3.C b/gcc/testsuite/g++.dg/expr/cast3.C new file mode 100644 index 000000000000..2ca56c2698ab --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/cast3.C @@ -0,0 +1,22 @@ +// { dg-do compile } + +enum MyState +{ + QUIT = 0, + START, + STOP, + PAUSE +}; + +double GetDouble() +{ + return 1.0; +} + +int main() +{ + MyState the_state; + + the_state = (MyState)GetDouble(); // { dg-bogus "invalid cast" } + return 0; +}