aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2016-03-05 07:50:23 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2016-03-05 07:50:23 +0100
commitdf762bb20ae6b04ecfb732400e1db6dd55b9f0de (patch)
tree04ee91462eeefafc7e167012c44ecd0480dfa81a /gcc
parent7d461295b8416387baf6875ab975d5a000299662 (diff)
downloadgcc-df762bb20ae6b04ecfb732400e1db6dd55b9f0de.zip
gcc-df762bb20ae6b04ecfb732400e1db6dd55b9f0de.tar.gz
gcc-df762bb20ae6b04ecfb732400e1db6dd55b9f0de.tar.bz2
re PR c++/70084 (va_arg ((ap), int) regression on s390*-*)
PR c++/70084 * tree-inline.c (copy_tree_body_r): When cancelling ADDR_EXPR of INDIRECT_REF and ADDR_EXPR changed type, fold_convert it to the right type. * g++.dg/expr/stdarg3.C: New test. From-SVN: r234004
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/expr/stdarg3.C18
-rw-r--r--gcc/tree-inline.c7
4 files changed, 36 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 7d2034b..1c775b2 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2016-03-05 Jakub Jelinek <jakub@redhat.com>
+
+ PR c++/70084
+ * tree-inline.c (copy_tree_body_r): When cancelling ADDR_EXPR
+ of INDIRECT_REF and ADDR_EXPR changed type, fold_convert it
+ to the right type.
+
2016-03-04 Bernd Schmidt <bschmidt@redhat.com>
PR c/69973
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 4b08dcd..808b0c8 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2016-03-05 Jakub Jelinek <jakub@redhat.com>
+
+ PR c++/70084
+ * g++.dg/expr/stdarg3.C: New test.
+
2016-03-04 Jeff Law <law@redhat.com>
PR tree-optimization/69196
diff --git a/gcc/testsuite/g++.dg/expr/stdarg3.C b/gcc/testsuite/g++.dg/expr/stdarg3.C
new file mode 100644
index 0000000..97aade0
--- /dev/null
+++ b/gcc/testsuite/g++.dg/expr/stdarg3.C
@@ -0,0 +1,18 @@
+// PR c++/70084
+// { dg-do compile }
+
+#include <stdarg.h>
+
+struct A
+{
+ A (const char *f, ...);
+};
+
+A::A (const char *f, ...)
+{
+ va_list ap;
+ va_start (ap, f);
+ int i = va_arg (ap, int); // { dg-bogus "first argument to 'va_arg' not of type 'va_list'" }
+ int j = va_arg ((ap), int); // { dg-bogus "first argument to 'va_arg' not of type 'va_list'" }
+ va_end (ap);
+}
diff --git a/gcc/tree-inline.c b/gcc/tree-inline.c
index 073c1c7..d52e0c6 100644
--- a/gcc/tree-inline.c
+++ b/gcc/tree-inline.c
@@ -1266,7 +1266,12 @@ copy_tree_body_r (tree *tp, int *walk_subtrees, void *data)
/* Handle the case where we substituted an INDIRECT_REF
into the operand of the ADDR_EXPR. */
if (TREE_CODE (TREE_OPERAND (*tp, 0)) == INDIRECT_REF)
- *tp = TREE_OPERAND (TREE_OPERAND (*tp, 0), 0);
+ {
+ tree t = TREE_OPERAND (TREE_OPERAND (*tp, 0), 0);
+ if (TREE_TYPE (t) != TREE_TYPE (*tp))
+ t = fold_convert (remap_type (TREE_TYPE (*tp), id), t);
+ *tp = t;
+ }
else
recompute_tree_invariant_for_addr_expr (*tp);