OSDN Git Service

2009-05-05 Richard Guenther <rguenther@suse.de>
authorrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 5 May 2009 16:08:24 +0000 (16:08 +0000)
committerrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 5 May 2009 16:08:24 +0000 (16:08 +0000)
PR middle-end/40023
* builtins.c (gimplify_va_arg_expr): Properly build the
address.

* gcc.c-torture/compile/pr40023.c: New testcase.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@147127 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/builtins.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/compile/pr40023.c [new file with mode: 0644]

index 365176b..f976b77 100644 (file)
@@ -1,3 +1,9 @@
+2009-05-05  Richard Guenther  <rguenther@suse.de>
+
+       PR middle-end/40023
+       * builtins.c (gimplify_va_arg_expr): Properly build the
+       address.
+
 2009-05-05  Shujing Zhao  <pearly.zhao@oracle.com>
 
        * tree.h (strip_float_extensions): Remove duplicate declaration.
index 0436229..e124189 100644 (file)
@@ -5033,7 +5033,7 @@ gimplify_va_arg_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p)
          if (TREE_CODE (TREE_TYPE (valist)) == ARRAY_TYPE)
            {
              tree p1 = build_pointer_type (TREE_TYPE (have_va_type));
-             valist = build_fold_addr_expr_with_type (valist, p1);
+             valist = fold_convert (p1, build_fold_addr_expr (valist));
            }
 
          gimplify_expr (&valist, pre_p, post_p, is_gimple_val, fb_rvalue);
index f6ef3ef..4dae1ab 100644 (file)
@@ -1,3 +1,8 @@
+2009-05-05  Richard Guenther  <rguenther@suse.de>
+
+       PR middle-end/40023
+       * gcc.c-torture/compile/pr40023.c: New testcase.
+
 2009-05-05  Nathan Sidwell  <nathan@codesourcery.com>
 
        * g++.old-deja/g++.other/overload11.C: Adjust expected errors.
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr40023.c b/gcc/testsuite/gcc.c-torture/compile/pr40023.c
new file mode 100644 (file)
index 0000000..93d8f68
--- /dev/null
@@ -0,0 +1,11 @@
+typedef __builtin_va_list va_list;
+typedef struct {
+    va_list ap;
+} ScanfState;
+void
+GetInt(ScanfState *state, long llval)
+{
+  *__builtin_va_arg(state->ap,long *) = llval;
+  __builtin_va_end(state->ap);
+}
+