]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR c++/28349 (ICE with "undefined" va_arg and references)
authorAndrew Pinski <pinskia@gcc.gnu.org>
Tue, 10 Oct 2006 04:38:25 +0000 (21:38 -0700)
committerAndrew Pinski <pinskia@gcc.gnu.org>
Tue, 10 Oct 2006 04:38:25 +0000 (21:38 -0700)
2006-10-09  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-10-09  Andrew Pinski  <pinskia@physics.uc.edu>

        PR c++/28349
        * testsuite/g++.dg/warn/var-args1.C: New test

From-SVN: r117595

gcc/cp/ChangeLog
gcc/cp/call.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/warn/var-args1.C [new file with mode: 0644]

index d8e8d1440e7260f4ce49de55e93795dc4b12399e..8288aa3b160788fc5494411476dc074fef048cf5 100644 (file)
@@ -1,3 +1,9 @@
+2006-10-09  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-09-09  Jason Merrill  <jason@redhat.com>
 
        PR c++/28996
@@ -16,7 +22,7 @@
 
 2006-09-06  Zak Kipling  <zak@transversal.com>
 
-        PR c++/26195
+       PR c++/26195
        * decl.c (make_rtl_for_nonlocal_decl),
        (start_preparsed_function): Don't use lbasename on
        input_filename when calling get_fileinfo.
index da3ea1da226bd341cdab4748fb8ab672833bd46e..9eb4b882a419a9fdb33b427f687bfb2e3aa4fa9c 100644 (file)
@@ -4488,10 +4488,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 ("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);
index 556dfca8d8f77a709ba7544081d96c46a253e032..3fa5a85d7778621cf83b749dfaf25cfbf119ae05 100644 (file)
@@ -1,3 +1,8 @@
+2006-10-09  Andrew Pinski  <pinskia@physics.uc.edu>
+
+       PR c++/28349
+       * testsuite/g++.dg/warn/var-args1.C: New test.
+
 2006-10-08  Andrew Pinski  <pinskia@physics.uc.edu>
 
        PR debug/28980
diff --git a/gcc/testsuite/g++.dg/warn/var-args1.C b/gcc/testsuite/g++.dg/warn/var-args1.C
new file mode 100644 (file)
index 0000000..aadac20
--- /dev/null
@@ -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" } */
+}
+