Handle errors in both args of va_arg
authorTom de Vries <tom@codesourcery.com>
Mon, 29 Aug 2016 16:41:33 +0000 (16:41 +0000)
committerTom de Vries <vries@gcc.gnu.org>
Mon, 29 Aug 2016 16:41:33 +0000 (16:41 +0000)
2016-08-29  Tom de Vries  <tom@codesourcery.com>

PR c/77398
* c-common.c (build_va_arg): Add first argument error.  Build va_arg
with error_mark_node as va_list instead of with illegal va_list.

* gimplify.c (gimplify_va_arg_expr): Replace first argument type error
with assert.

* g++.dg/ext/va-arg1.C: Add error check for illegal first argument.

From-SVN: r239827

gcc/ChangeLog
gcc/c-family/ChangeLog
gcc/c-family/c-common.c
gcc/gimplify.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/ext/va-arg1.C

index 7bde05e33045836f88ab132cb1a993d7dcd3a7b3..55906fea96bd53d83572d28c34a8a218585ab882 100644 (file)
@@ -1,3 +1,9 @@
+2016-08-29  Tom de Vries  <tom@codesourcery.com>
+
+       PR c/77398
+       * gimplify.c (gimplify_va_arg_expr): Replace first argument type error
+       with assert.
+
 2016-08-29  Eric Botcazou  <ebotcazou@adacore.com>
 
        * Makefile.in (gcov-iov.h): Add dummy recipe.
index f8a7425548c29ea5780e4f151fe4e6399d188af9..b6876d4bae025205f60d1b73cad72e06a337ef11 100644 (file)
@@ -1,3 +1,9 @@
+2016-08-29  Tom de Vries  <tom@codesourcery.com>
+
+       PR c/77398
+       * c-common.c (build_va_arg): Add first argument error.  Build va_arg
+       with error_mark_node as va_list instead of with illegal va_list.
+
 2016-08-25  Marek Polacek  <polacek@redhat.com>
            David Malcolm  <dmalcolm@redhat.com>
 
index 001070d58bc971c5aa675f72e563880f8389f685..eef86744038b42ae7393306c423cfd3696e3dfae 100644 (file)
@@ -5806,16 +5806,19 @@ build_va_arg (location_t loc, tree expr, tree type)
 {
   tree va_type = TREE_TYPE (expr);
   tree canon_va_type = (va_type == error_mark_node
-                       ? NULL_TREE
+                       ? error_mark_node
                        : targetm.canonical_va_list_type (va_type));
 
   if (va_type == error_mark_node
       || canon_va_type == NULL_TREE)
     {
+      if (canon_va_type == NULL_TREE)
+       error_at (loc, "first argument to %<va_arg%> not of type %<va_list%>");
+
       /* Let's handle things neutrallly, if expr:
         - has undeclared type, or
         - is not an va_list type.  */
-      return build_va_arg_1 (loc, type, expr);
+      return build_va_arg_1 (loc, type, error_mark_node);
     }
 
   if (TREE_CODE (canon_va_type) != ARRAY_TYPE)
index 4715332eddf4f4de74a56a5df4feacd021c4e10c..288b4727dd82709940cdfe31d6819aacb11bd341 100644 (file)
@@ -11959,12 +11959,7 @@ gimplify_va_arg_expr (tree *expr_p, gimple_seq *pre_p,
   if (have_va_type == error_mark_node)
     return GS_ERROR;
   have_va_type = targetm.canonical_va_list_type (have_va_type);
-
-  if (have_va_type == NULL_TREE)
-    {
-      error_at (loc, "first argument to %<va_arg%> not of type %<va_list%>");
-      return GS_ERROR;
-    }
+  gcc_assert (have_va_type != NULL_TREE);
 
   /* Generate a diagnostic for requesting data of a type that cannot
      be passed through `...' due to type promotion at the call site.  */
index 6deec7d351ecb21db9913b04e1d7d6e5a9eeb91e..577df5111b15e83485535f98c6c3fccb2efce53f 100644 (file)
@@ -1,3 +1,8 @@
+2016-08-29  Tom de Vries  <tom@codesourcery.com>
+
+       PR c/77398
+       * g++.dg/ext/va-arg1.C: Add error check for illegal first argument.
+
 2016-08-29  Eric Botcazou  <ebotcazou@adacore.com>
 
        * gcc.dg/ipa/iinline-attr.c: XFAIL on Visium.
index 5606128e5f777d715b61d719b0fac0d36773d25b..c0477adcb76a4f76e808b80cb13a6071d1d1b977 100644 (file)
@@ -4,5 +4,7 @@ struct A {};
 
 void foo()
 {
-  ++__builtin_va_arg(0, A); // { dg-error "operand type is 'A'" }
+  ++__builtin_va_arg (0, A);
+  // { dg-error "operand type is 'A'" "" {target *-*-*} "7" }
+  // { dg-error "first argument to 'va_arg' not of type 'va_list'" "" {target *-*-*} "7" }
 }