aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorAndrew Pinski <pinskia@physics.uc.edu>2006-08-30 04:33:10 +0000
committerAndrew Pinski <pinskia@gcc.gnu.org>2006-08-29 21:33:10 -0700
commita2ef097954b08063f1100d45c3d8499ac9fc46f8 (patch)
tree16ef4a07a120cc02176ba6ede6da85b920df120d /gcc
parent1bdd6b682bc19448041c469da99ec4be58592e42 (diff)
downloadgcc-a2ef097954b08063f1100d45c3d8499ac9fc46f8.zip
gcc-a2ef097954b08063f1100d45c3d8499ac9fc46f8.tar.gz
gcc-a2ef097954b08063f1100d45c3d8499ac9fc46f8.tar.bz2
re PR c++/28349 (ICE with "undefined" va_arg and references)
2006-08-29 Andrew Pinski <pinskia@physics.uc.edu> PR c++/28349 * testsuite/g++.dg/warn/var-args1.C: New test. 2006-08-29 Andrew Pinski <pinskia@physics.uc.edu> PR C++/28349 * call.c (build_x_va_arg): Remove the reference type from the type before creating the pointer type. From-SVN: r116577
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/call.c4
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/warn/var-args1.C11
4 files changed, 25 insertions, 1 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 3774c14..cda2742 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,9 @@
+2006-08-29 Andrew Pinski <pinskia@physics.uc.edu>
+
+ PR C++/28349
+ * call.c (build_x_va_arg): Remove the reference type
+ from the type before creating the pointer type.
+
2006-08-29 J"orn Rennecke <joern.rennecke@st.com>
PR c++/28139
diff --git a/gcc/cp/call.c b/gcc/cp/call.c
index a91ecd0..7a6646f 100644
--- a/gcc/cp/call.c
+++ b/gcc/cp/call.c
@@ -4544,10 +4544,12 @@ build_x_va_arg (tree expr, tree type)
if (! pod_type_p (type))
{
+ /* Remove reference types so we don't ICE later on. */
+ tree type1 = non_reference (type);
/* Undefined behavior [expr.call] 5.2.2/7. */
warning (0, "cannot receive objects of non-POD type %q#T through %<...%>; "
"call will abort at runtime", type);
- expr = convert (build_pointer_type (type), null_node);
+ expr = convert (build_pointer_type (type1), null_node);
expr = build2 (COMPOUND_EXPR, TREE_TYPE (expr),
call_builtin_trap (), expr);
expr = build_indirect_ref (expr, NULL);
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 6729166..15f5d63 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2006-08-29 Andrew Pinski <pinskia@physics.uc.edu>
+
+ PR c++/28349
+ * testsuite/g++.dg/warn/var-args1.C: New test.
+
2006-08-29 Steven G. Kargl <kargls@comcast.net>
PR fortran/28866
diff --git a/gcc/testsuite/g++.dg/warn/var-args1.C b/gcc/testsuite/g++.dg/warn/var-args1.C
new file mode 100644
index 0000000..aadac20
--- /dev/null
+++ b/gcc/testsuite/g++.dg/warn/var-args1.C
@@ -0,0 +1,11 @@
+/* { dg-do compile } */
+
+#include <stdarg.h>
+
+void foo(int, ...)
+{
+ va_list va;
+ int i;
+ i = va_arg(va, int&); /* { dg-warning "cannot receive objects" } */
+}
+