re PR c++/27505 (ICE in const folding with bitfields)
authorMark Mitchell <mark@codesourcery.com>
Mon, 15 May 2006 22:54:19 +0000 (22:54 +0000)
committerMark Mitchell <mmitchel@gcc.gnu.org>
Mon, 15 May 2006 22:54:19 +0000 (22:54 +0000)
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
gcc/cp/call.c
gcc/cp/cp-tree.h
gcc/cp/tree.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/expr/bitfield1.C [new file with mode: 0644]

index 0d6295327c359212b5da81c5df23f813eb403c1b..3bdf214a310b45c7779f960ddae46160f06e1b8f 100644 (file)
@@ -1,3 +1,12 @@
+2006-05-15  Mark Mitchell  <mark@codesourcery.com>
+
+       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  <reichelt@igpm.rwth-aachen.de>
 
        PR c++/27582
index 6743f924c2dd297865f84d065135b1bd083c3e44..a7cb22aab2f12a7a38b0ec697568e1be42e4ad5e 100644 (file)
@@ -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.  */
index 2e5739a7eb68a036839d070b47500eaa95003556..8e56a9fc528efc5f22c7881ce401097908e126ab 100644 (file)
@@ -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);
index 60ba13f99369cfcec2de6686475752d71e130ea0..bc8e737578934a180c0b103621c74037d7595f71 100644 (file)
@@ -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);
index 771256a464f2b620c50d5f1a7761002e0ea13a1a..529a209fa289686cd2a87f82356866d46a94816b 100644 (file)
@@ -1,3 +1,8 @@
+2006-05-15  Mark Mitchell  <mark@codesourcery.com>
+
+       PR c++/27505
+       * g++.dg/expr/bitfield1.C: New test.
+
 2006-05-15  Richard Guenther  <rguenther@suse.de>
 
        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 (file)
index 0000000..f3d4741
--- /dev/null
@@ -0,0 +1,12 @@
+// PR c++/27505
+
+struct s {
+  bool field:8;
+};
+
+void
+foo (struct s *p)
+{
+  if (!p->field)
+    ;
+}