From e103969791150d968fa95548d77fdc2a98587289 Mon Sep 17 00:00:00 2001 From: Mark Mitchell Date: Mon, 15 May 2006 22:54:19 +0000 Subject: [PATCH] re PR c++/27505 (ICE in const folding with bitfields) PR c++/27505 * call.c (convert_like_real): Convert bitfields to their declared types when forming an rvalue. * tree.c (convert_bitfield_to_declared_type): New function. (rvalue): Use it. * cp-tree.h (convert_bitfield_to_declare_type): Declare it. PR c++/27505 * g++.dg/expr/bitfield1.C: New test. From-SVN: r113803 --- gcc/cp/ChangeLog | 9 +++++++++ gcc/cp/call.c | 1 + gcc/cp/cp-tree.h | 1 + gcc/cp/tree.c | 23 ++++++++++++++++++----- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/expr/bitfield1.C | 12 ++++++++++++ 6 files changed, 46 insertions(+), 5 deletions(-) create mode 100644 gcc/testsuite/g++.dg/expr/bitfield1.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 0d6295327c3..3bdf214a310 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,12 @@ +2006-05-15 Mark Mitchell + + PR c++/27505 + * call.c (convert_like_real): Convert bitfields to their declared + types when forming an rvalue. + * tree.c (convert_bitfield_to_declared_type): New function. + (rvalue): Use it. + * cp-tree.h (convert_bitfield_to_declare_type): Declare it. + 2006-05-15 Volker Reichelt PR c++/27582 diff --git a/gcc/cp/call.c b/gcc/cp/call.c index 6743f924c2d..a7cb22aab2f 100644 --- a/gcc/cp/call.c +++ b/gcc/cp/call.c @@ -4328,6 +4328,7 @@ convert_like_real (conversion *convs, tree expr, tree fn, int argnum, switch (convs->kind) { case ck_rvalue: + expr = convert_bitfield_to_declared_type (expr); if (! IS_AGGR_TYPE (totype)) return expr; /* Else fall through. */ diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h index 2e5739a7eb6..8e56a9fc528 100644 --- a/gcc/cp/cp-tree.h +++ b/gcc/cp/cp-tree.h @@ -4335,6 +4335,7 @@ extern tree cp_add_pending_fn_decls (void*,tree); extern int cp_auto_var_in_fn_p (tree,tree); extern tree fold_if_not_in_template (tree); extern tree rvalue (tree); +extern tree convert_bitfield_to_declared_type (tree); /* in typeck.c */ extern int string_conv_p (tree, tree, int); diff --git a/gcc/cp/tree.c b/gcc/cp/tree.c index 60ba13f9936..bc8e7375789 100644 --- a/gcc/cp/tree.c +++ b/gcc/cp/tree.c @@ -362,22 +362,35 @@ get_target_expr (tree init) return build_target_expr_with_type (init, TREE_TYPE (init)); } +/* If EXPR is a bitfield reference, convert it to the declared type of + the bitfield, and return the resulting expression. Otherwise, + return EXPR itself. */ + +tree +convert_bitfield_to_declared_type (tree expr) +{ + tree bitfield_type; + + bitfield_type = is_bitfield_expr_with_lowered_type (expr); + if (bitfield_type) + expr = cp_convert (TYPE_MAIN_VARIANT (bitfield_type), expr); + return expr; +} + /* EXPR is being used in an rvalue context. Return a version of EXPR that is marked as an rvalue. */ tree rvalue (tree expr) { - tree type; + expr = convert_bitfield_to_declared_type (expr); if (real_lvalue_p (expr)) { - type = is_bitfield_expr_with_lowered_type (expr); - if (type) - return cp_convert (TYPE_MAIN_VARIANT (type), expr); - type = TREE_TYPE (expr); + tree type; /* [basic.lval] Non-class rvalues always have cv-unqualified types. */ + type = TREE_TYPE (expr); if (!CLASS_TYPE_P (type)) type = TYPE_MAIN_VARIANT (type); expr = build1 (NON_LVALUE_EXPR, type, expr); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 771256a464f..529a209fa28 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2006-05-15 Mark Mitchell + + PR c++/27505 + * g++.dg/expr/bitfield1.C: New test. + 2006-05-15 Richard Guenther PR tree-optimization/27603 diff --git a/gcc/testsuite/g++.dg/expr/bitfield1.C b/gcc/testsuite/g++.dg/expr/bitfield1.C new file mode 100644 index 00000000000..f3d47417b28 --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/bitfield1.C @@ -0,0 +1,12 @@ +// PR c++/27505 + +struct s { + bool field:8; +}; + +void +foo (struct s *p) +{ + if (!p->field) + ; +} -- 2.30.2