diff options
author | Mark Mitchell <mark@codesourcery.com> | 2006-04-23 18:04:33 +0000 |
---|---|---|
committer | Mark Mitchell <mmitchel@gcc.gnu.org> | 2006-04-23 18:04:33 +0000 |
commit | 38a4afeecdf392267ff73a27a69f458b5d8b424c (patch) | |
tree | 795f298e0af32f79064b451399d8021ab268f911 /gcc/cp/call.c | |
parent | acb188c1ba3c0a94da659f679d4227f955488037 (diff) | |
download | gcc-38a4afeecdf392267ff73a27a69f458b5d8b424c.zip gcc-38a4afeecdf392267ff73a27a69f458b5d8b424c.tar.gz gcc-38a4afeecdf392267ff73a27a69f458b5d8b424c.tar.bz2 |
re PR c++/26534 ([4.1] bitfield wrong optimize)
2006-04-23 Mark Mitchell <mark@codesourcery.com>
PR c++/26534
* c-common.h (c_build_bitfield_integer_type): Declare.
* c-decl.c (c_build_bitfield_integer_type): Move to ...
* c-common.c (c_build_bitfield_integer_type): ... here.
2006-04-23 Mark Mitchell <mark@codesourcery.com>
PR c++/26534
* cp-tree.h (is_bitfield_expr_with_lowered_type): New function.
* typeck.c (is_bitfield_expr_with_lowered_type): New function.
(decay_conversion): Convert bitfield expressions to the correct
type.
(build_modify_expr): Remove spurious conversions.
* class.c (layout_class_type): Modify the type of bitfields to
indicate a limited range.
* call.c (standard_conversion): Adjust the type of bitfield
expressions used in an rvalue context.
(build_conditional_expr): Likewise.
2006-04-23 Mark Mitchell <mark@codesourcery.com>
PR c++/26534
* g++.dg/opt/bitfield1.C: New test.
* g++.dg/compat/abi/bitfield1_main.C: Add -w.
* g++.dg/compat/abi/bitfield1_x.C: Likewise.
* g++.dg/compat/abi/bitfield1_y.C: Likewise.
* g++.dg/compat/abi/bitfield2_main.C: Likewise.
* g++.dg/compat/abi/bitfield2_x.C: Likewise.
* g++.dg/compat/abi/bitfield2_y.C: Likewise.
* g++.dg/abi/bitfield1.C: Add dg-warning markers.
* g++.dg/abi/bitfield2.C: Likewise.
* g++.dg/init/bitfield1.C: Likewise.
From-SVN: r113199
Diffstat (limited to 'gcc/cp/call.c')
-rw-r--r-- | gcc/cp/call.c | 19 |
1 files changed, 16 insertions, 3 deletions
diff --git a/gcc/cp/call.c b/gcc/cp/call.c index c9826451..6743f92 100644 --- a/gcc/cp/call.c +++ b/gcc/cp/call.c @@ -623,7 +623,16 @@ standard_conversion (tree to, tree from, tree expr, bool c_cast_p, conv = build_conv (ck_lvalue, from, conv); } else if (fromref || (expr && lvalue_p (expr))) - conv = build_conv (ck_rvalue, from, conv); + { + if (expr) + { + tree bitfield_type; + bitfield_type = is_bitfield_expr_with_lowered_type (expr); + if (bitfield_type) + from = bitfield_type; + } + conv = build_conv (ck_rvalue, from, conv); + } /* Allow conversion between `__complex__' data types. */ if (tcode == COMPLEX_TYPE && fcode == COMPLEX_TYPE) @@ -3196,8 +3205,12 @@ build_conditional_expr (tree arg1, tree arg2, tree arg3) array-to-pointer (_conv.array_), and function-to-pointer (_conv.func_) standard conversions are performed on the second and third operands. */ - arg2_type = TREE_TYPE (arg2); - arg3_type = TREE_TYPE (arg3); + arg2_type = is_bitfield_expr_with_lowered_type (arg2); + if (!arg2_type) + arg2_type = TREE_TYPE (arg2); + arg3_type = is_bitfield_expr_with_lowered_type (arg3); + if (!arg3_type) + arg3_type = TREE_TYPE (arg3); if (VOID_TYPE_P (arg2_type) || VOID_TYPE_P (arg3_type)) { /* Do the conversions. We don't these for `void' type arguments |