re PR middle-end/15885 (wrong va_start warning (and code))
authorJason Merrill <jason@gcc.gnu.org>
Thu, 15 Jul 2004 21:50:51 +0000 (17:50 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Thu, 15 Jul 2004 21:50:51 +0000 (17:50 -0400)
        * cp-lang.c (cxx_types_compatible_p): To the middle-end,
        references and pointers are compatible.

        PR middle-end/15885
        * gimplify.c (gimplify_arg): New fn, split out from...
        (gimplify_call_expr): Here.  Special-case BUILT_IN_VA_START.

From-SVN: r84782

gcc/ChangeLog
gcc/cp/ChangeLog
gcc/cp/cp-lang.c
gcc/gimplify.c

index f0eb71fe793b213de36c50b3253369db557eeac9..8c1b4a8b88c5223cf3e38be4c8c46afdae679e4a 100644 (file)
@@ -1,3 +1,9 @@
+2004-07-14  Jason Merrill  <jason@redhat.com>
+
+       PR middle-end/15885
+       * gimplify.c (gimplify_arg): New fn, split out from...
+       (gimplify_call_expr): Here.  Special-case BUILT_IN_VA_START.
+
 2004-07-15  Roman Zippel  <zippel@linux-m68k.org>
 
        * config/m68k/m68k.c (output_move_qimode): Abort on an attempt to 
 
 2004-07-15  Aldy Hernandez  <aldyh@redhat.com>
 
-        * config/rs6000/rs6000.md ("bunordered"): Disable for e500.
-        ("bordered"): Same.
+       * config/rs6000/rs6000.md ("bunordered"): Disable for e500.
+       ("bordered"): Same.
 
 2004-07-15  Aldy Hernandez  <aldyh@redhat.com>
 
-        * config/rs6000/rs6000.md ("*cceq_ior_compare"): Allow
-        unconditionally.
-        * config/rs6000/spe.md ("e500_cceq_ior_compare"): Remove.
+       * config/rs6000/rs6000.md ("*cceq_ior_compare"): Allow
+       unconditionally.
+       * config/rs6000/spe.md ("e500_cceq_ior_compare"): Remove.
 
 2004-07-15  Richard Sandiford  <rsandifo@redhat.com>
 
@@ -59,7 +65,7 @@
 
        * print-tree.c (print_node): Fix casts last change.
 
-2004-07-15  Paul Brook  <paul@codesourcery.com>
+2004-07-15  Paul Brook <paul@codesourcery.com>
 
        * dwarf2out.c (dwarf2out_begin_prologue): Rename IA64_UNWIND_INFO
        to TARGET_UNWIND_INFO.
        Use alias set 0 for memory, do proper mode calculations and adjust
        address for memories.
 
-2004-07-14  Per Bothner  <per@bothner.com>
+2004-07-14  Per Bothner         <per@bothner.com>
 
        * input.h:  If USE_MAPPED_LOCATION, define separate expanded_location
        structure with extra column field.
        * config/sh/sh.c (sh_gimplify_va_arg_expr): Likewise.
        * config/xtensa/xtensa.c (xtensa_gimplify_va_arg_expr): Likewise.
 
-2004-07-14  Mike Stump  <mrs@apple.com>
+2004-07-14  Mike Stump <mrs@apple.com>
 
        * config/darwin.h (WINT_TYPE): Define to be int to match
-        system header files.
+       system header files.
 
 2004-07-14  Bob Wilson  <bob.wilson@acm.org>
 
index c93ce695675e1089935759957aa96c30831835c0..830fc4b69febcc7fcebb778f5274bf027cf70dba 100644 (file)
@@ -1,3 +1,8 @@
+2004-07-15  Jason Merrill  <jason@redhat.com>
+
+       * cp-lang.c (cxx_types_compatible_p): To the middle-end,
+       references and pointers are compatible.
+
 2004-07-15  Nathan Sidwell  <nathan@codesourcery.com>
 
        * decl.c (xref_basetypes): Refactor.
@@ -16,7 +21,7 @@
 
 2004-07-15  Nathan Sidwell  <nathan@codesourcery.com>
 
-       * class.c(finish_struct_bits): Don't set TYPE_HAS_CONVERSION here.
+       * class.c (finish_struct_bits): Don't set TYPE_HAS_CONVERSION here.
        * decl.c (xref_basetypes): Set it here.
 
        * class.c (check_bases): Don't set CLASSTYPE_NON_AGGREGATE here.
index 5f38fbb10257e8951f18d7ad9f96830ae36a2015..b6e933fede6f8b9ce75fd877d42fed3aafdb31b4 100644 (file)
@@ -317,9 +317,23 @@ cp_var_mod_type_p (tree type, tree fn)
   return false;
 }
 
+/* This compares two types for equivalence ("compatible" in C-based languages).
+   This routine should only return 1 if it is sure.  It should not be used
+   in contexts where erroneously returning 0 causes problems.  */
+
 static int cxx_types_compatible_p (tree x, tree y)
 {
-  return same_type_ignoring_top_level_qualifiers_p (x, y);
+  if (same_type_ignoring_top_level_qualifiers_p (x, y))
+    return 1;
+
+  /* Once we get to the middle-end, references and pointers are
+     interchangeable.  FIXME should we try to replace all references with
+     pointers?  */
+  if (POINTER_TYPE_P (x) && POINTER_TYPE_P (y)
+      && same_type_p (TREE_TYPE (x), TREE_TYPE (y)))
+    return 1;
+
+  return 0;
 }
 
 /* Construct a C++-aware pretty-printer for CONTEXT.  It is assumed
index d1b9618f059526c4c1477aa5936bacb6867412b4..642cff9b81eccaa4e6478f1549851959f189ab48 100644 (file)
@@ -1788,6 +1788,31 @@ gimplify_self_mod_expr (tree *expr_p, tree *pre_p, tree *post_p,
     }
 }
 
+/* Subroutine of gimplify_call_expr:  Gimplify a single argument.  */
+
+static enum gimplify_status
+gimplify_arg (tree *expr_p, tree *pre_p)
+{
+  bool (*test) (tree);
+  fallback_t fb;
+
+  /* In general, we allow lvalues for function arguments to avoid
+     extra overhead of copying large aggregates out of even larger
+     aggregates into temporaries only to copy the temporaries to
+     the argument list.  Make optimizers happy by pulling out to
+     temporaries those types that fit in registers.  */
+  if (is_gimple_reg_type (TREE_TYPE (*expr_p)))
+    test = is_gimple_val, fb = fb_rvalue;
+  else
+    test = is_gimple_lvalue, fb = fb_either;
+
+  /* There is a sequence point before a function call.  Side effects in
+     the argument list must occur before the actual call. So, when
+     gimplifying arguments, force gimplify_expr to use an internal
+     post queue which is then appended to the end of PRE_P.  */
+  return gimplify_expr (expr_p, pre_p, NULL, test, fb);
+}
+
 /* Gimplify the CALL_EXPR node pointed by EXPR_P.  PRE_P points to the
    list where side effects that must happen before *EXPR_P should be stored.
    WANT_VALUE is true if the result of the call is desired.  */
@@ -1847,6 +1872,11 @@ gimplify_call_expr (tree *expr_p, tree *pre_p, bool want_value)
          *expr_p = new;
          return GS_OK;
        }
+
+      if (DECL_FUNCTION_CODE (decl) == BUILT_IN_VA_START)
+       /* Avoid gimplifying the second argument to va_start, which needs
+          to be the plain PARM_DECL.  */
+       return gimplify_arg (&TREE_VALUE (TREE_OPERAND (*expr_p, 1)), pre_p);
     }
 
   /* There is a sequence point before the call, so any side effects in
@@ -1861,24 +1891,8 @@ gimplify_call_expr (tree *expr_p, tree *pre_p, bool want_value)
        arglist = TREE_CHAIN (arglist))
     {
       enum gimplify_status t;
-      bool (*test) (tree);
-      fallback_t fb;
-
-      /* In general, we allow lvalues for function arguments to avoid
-        extra overhead of copying large aggregates out of even larger
-        aggregates into temporaries only to copy the temporaries to
-        the argument list.  Make optimizers happy by pulling out to
-        temporaries those types that fit in registers.  */
-      if (is_gimple_reg_type (TREE_TYPE (TREE_VALUE (arglist))))
-       test = is_gimple_val, fb = fb_rvalue;
-      else
-       test = is_gimple_lvalue, fb = fb_either;
 
-      /* There is a sequence point before a function call.  Side effects in
-        the argument list must occur before the actual call. So, when
-        gimplifying arguments, force gimplify_expr to use an internal
-        post queue which is then appended to the end of PRE_P.  */
-      t = gimplify_expr (&TREE_VALUE (arglist), pre_p, NULL, test, fb);
+      t = gimplify_arg (&TREE_VALUE (arglist), pre_p);
 
       if (t == GS_ERROR)
        ret = GS_ERROR;