re PR c/65901 (no warning or error for va_arg (ap, void))
authorMarek Polacek <mpolacek@gcc.gnu.org>
Tue, 28 Apr 2015 08:36:50 +0000 (08:36 +0000)
committerMarek Polacek <mpolacek@gcc.gnu.org>
Tue, 28 Apr 2015 08:36:50 +0000 (08:36 +0000)
PR c/65901
* c-typeck.c (c_build_va_arg): Require TYPE be a complete type.

* gcc.c-torture/compile/pr48767.c (foo): Add dg-error.
* gcc.dg/pr65901.c: New test.

From-SVN: r222515

gcc/c/ChangeLog
gcc/c/c-typeck.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/compile/pr48767.c
gcc/testsuite/gcc.dg/pr65901.c [new file with mode: 0644]

index 938262a93f7074ddafea4af5f66ad9b540a855ec..5d50d4cb5be31a24f133bc64e142ad0d6fd7df40 100644 (file)
@@ -1,3 +1,8 @@
+2015-04-28  Marek Polacek  <polacek@redhat.com>
+
+       PR c/65901
+       * c-typeck.c (c_build_va_arg): Require TYPE be a complete type.
+
 2015-04-25  Marek Polacek  <polacek@redhat.com>
 
        PR c/52085
index 91735b54deaf720aa167bda5ad7174c8b305204e..c58e9181f0e6fa7f5d853b2544bf84f532bfab74 100644 (file)
@@ -12648,6 +12648,11 @@ c_build_va_arg (location_t loc, tree expr, tree type)
   if (warn_cxx_compat && TREE_CODE (type) == ENUMERAL_TYPE)
     warning_at (loc, OPT_Wc___compat,
                "C++ requires promoted type, not enum type, in %<va_arg%>");
+  if (type == error_mark_node || !COMPLETE_TYPE_P (type))
+    {
+      c_incomplete_type_error (NULL_TREE, type);
+      return error_mark_node;
+    }
   return build_va_arg (loc, expr, type);
 }
 
index 703bc3aa19e4fcc3467437f92df701eec6c7b9f3..fcd850ce456057504bd7e7bc73bc8ee7a6be6974 100644 (file)
@@ -1,3 +1,9 @@
+2015-04-28  Marek Polacek  <polacek@redhat.com>
+
+       PR c/65901
+       * gcc.c-torture/compile/pr48767.c (foo): Add dg-error.
+       * gcc.dg/pr65901.c: New test.
+
 2015-04-28  Richard Biener  <rguenther@suse.de>
 
        PR tree-optimization/62283
@@ -11,7 +17,7 @@
 
 2015-04-27  Jeff Law <law@redhat.com>
 
-        PR tree-optimization/65217
+       PR tree-optimization/65217
        * gcc.target/i386/pr65217.c: Remove XFAIL.
 
 2015-04-27  Andre Vehreschild  <vehre@gmx.de>
index 66cb34885d04405100dfd3783d9695728aa42c59..c8fef35ad37dc0668b91f3346b751904c0f49960 100644 (file)
@@ -3,5 +3,5 @@
 void
 foo (__builtin_va_list ap)
 {
-  __builtin_va_arg (ap, void);
+  __builtin_va_arg (ap, void);  /* { dg-error "invalid use of void expression" } */
 }
diff --git a/gcc/testsuite/gcc.dg/pr65901.c b/gcc/testsuite/gcc.dg/pr65901.c
new file mode 100644 (file)
index 0000000..8708a1e
--- /dev/null
@@ -0,0 +1,16 @@
+/* PR c/65901 */
+/* { dg-do compile } */
+/* { dg-options "" } */
+
+struct S;
+enum E;
+union U;
+
+void
+foo (__builtin_va_list ap)
+{
+  __builtin_va_arg (ap, void);  /* { dg-error "invalid use of void expression" } */
+  __builtin_va_arg (ap, struct S);  /* { dg-error "invalid use of undefined type" } */
+  __builtin_va_arg (ap, enum E);  /* { dg-error "invalid use of undefined type" } */
+  __builtin_va_arg (ap, union U);  /* { dg-error "invalid use of undefined type" } */
+}