diff options
author | Andrew Pinski <pinskia@physics.uc.edu> | 2006-08-30 04:33:10 +0000 |
---|---|---|
committer | Andrew Pinski <pinskia@gcc.gnu.org> | 2006-08-29 21:33:10 -0700 |
commit | a2ef097954b08063f1100d45c3d8499ac9fc46f8 (patch) | |
tree | 16ef4a07a120cc02176ba6ede6da85b920df120d /gcc | |
parent | 1bdd6b682bc19448041c469da99ec4be58592e42 (diff) | |
download | gcc-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/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/call.c | 4 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/warn/var-args1.C | 11 |
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" } */ +} + |