From 725d6b877d6861a3075175c6620b6339f15eac6e Mon Sep 17 00:00:00 2001 From: Mark Mitchell Date: Fri, 23 Mar 2007 04:31:21 +0000 Subject: [PATCH] Mark Mitchell PR c++/31273 Mark Mitchell PR c++/31273 * call.c (standard_conversion): Use type_decays_to. Keep FCODE consistent with FROM. PR c++/31273 * g++.dg/expr/bitfield7.C: New test. From-SVN: r123150 --- gcc/cp/ChangeLog | 7 +++++++ gcc/cp/call.c | 15 ++++++--------- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/expr/bitfield7.C | 8 ++++++++ 4 files changed, 26 insertions(+), 9 deletions(-) create mode 100644 gcc/testsuite/g++.dg/expr/bitfield7.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 2a381230426..3de84b69166 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,10 @@ +2007-03-22 Jim Wilson + Mark Mitchell + + PR c++/31273 + * call.c (standard_conversion): Use type_decays_to. Keep FCODE + consistent with FROM. + 2007-03-22 Gabriel Dos Reis * error.c (dump_expr): Handle dependent names that designate types. diff --git a/gcc/cp/call.c b/gcc/cp/call.c index 8218ed44e42..320e51c09ff 100644 --- a/gcc/cp/call.c +++ b/gcc/cp/call.c @@ -636,15 +636,9 @@ standard_conversion (tree to, tree from, tree expr, bool c_cast_p, tcode = TREE_CODE (to); conv = build_identity_conv (from, expr); - if (fcode == FUNCTION_TYPE) + if (fcode == FUNCTION_TYPE || fcode == ARRAY_TYPE) { - from = build_pointer_type (from); - fcode = TREE_CODE (from); - conv = build_conv (ck_lvalue, from, conv); - } - else if (fcode == ARRAY_TYPE) - { - from = build_pointer_type (TREE_TYPE (from)); + from = type_decays_to (from); fcode = TREE_CODE (from); conv = build_conv (ck_lvalue, from, conv); } @@ -655,7 +649,10 @@ standard_conversion (tree to, tree from, tree expr, bool c_cast_p, tree bitfield_type; bitfield_type = is_bitfield_expr_with_lowered_type (expr); if (bitfield_type) - from = strip_top_quals (bitfield_type); + { + from = strip_top_quals (bitfield_type); + fcode = TREE_CODE (from); + } } conv = build_conv (ck_rvalue, from, conv); } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index a5f2623e291..a22b4c88e9e 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2007-03-22 Mark Mitchell + + PR c++/31273 + * g++.dg/expr/bitfield7.C: New test. + 2007-03-22 Manuel Lopez-Ibanez PR other/23572 diff --git a/gcc/testsuite/g++.dg/expr/bitfield7.C b/gcc/testsuite/g++.dg/expr/bitfield7.C new file mode 100644 index 00000000000..d274e3e98b9 --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/bitfield7.C @@ -0,0 +1,8 @@ +// PR c++/31273 + +enum E { e }; +struct S { + E v:5; +}; +S s; +int main() { if (!s.v) return 0; }