diff options
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/c-family/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/c-family/c-common.c | 7 | ||||
-rw-r--r-- | gcc/gimplify.c | 7 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/ext/va-arg1.C | 4 |
6 files changed, 26 insertions, 9 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 7bde05e..55906fe 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -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. diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog index f8a7425..b6876d4 100644 --- a/gcc/c-family/ChangeLog +++ b/gcc/c-family/ChangeLog @@ -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> diff --git a/gcc/c-family/c-common.c b/gcc/c-family/c-common.c index 001070d..eef8674 100644 --- a/gcc/c-family/c-common.c +++ b/gcc/c-family/c-common.c @@ -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) diff --git a/gcc/gimplify.c b/gcc/gimplify.c index 4715332..288b472 100644 --- a/gcc/gimplify.c +++ b/gcc/gimplify.c @@ -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. */ diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 6deec7d..577df51 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -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. diff --git a/gcc/testsuite/g++.dg/ext/va-arg1.C b/gcc/testsuite/g++.dg/ext/va-arg1.C index 5606128..c0477ad 100644 --- a/gcc/testsuite/g++.dg/ext/va-arg1.C +++ b/gcc/testsuite/g++.dg/ext/va-arg1.C @@ -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" } } |