From 72b5577d91948132078d1021b7db49f85bb884e4 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Fri, 29 May 2009 22:45:54 +0000 Subject: [PATCH] builtins.c (validate_gimple_arglist): Don't use va_arg with enum type. ./: * builtins.c (validate_gimple_arglist): Don't use va_arg with enum type. * calls.c (emit_library_call_value_1): Likewise. * c-typeck.c (c_build_va_arg): New function. * c-tree.h (c_build_va_arg): Declare. * c-parser.c (c_parser_postfix_expression): Call c_build_va_arg instead of build_va_arg. cp/: * error.c (cp_printer): Don't use va_arg with enum type. testsuite/: * gcc.dg/Wcxx-compat-11.c: New testcase. From-SVN: r147989 --- gcc/ChangeLog | 11 +++++++++++ gcc/builtins.c | 4 ++-- gcc/c-parser.c | 7 ++++--- gcc/c-tree.h | 1 + gcc/c-typeck.c | 11 +++++++++++ gcc/calls.c | 2 +- gcc/cp/ChangeLog | 4 ++++ gcc/cp/error.c | 4 ++-- gcc/testsuite/ChangeLog | 4 ++++ gcc/testsuite/gcc.dg/Wcxx-compat-11.c | 21 +++++++++++++++++++++ 10 files changed, 61 insertions(+), 8 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/Wcxx-compat-11.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 8315daca48be..f101cbf56164 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,14 @@ +2009-05-29 Ian Lance Taylor + + * builtins.c (validate_gimple_arglist): Don't use va_arg with + enum type. + * calls.c (emit_library_call_value_1): Likewise. + + * c-typeck.c (c_build_va_arg): New function. + * c-tree.h (c_build_va_arg): Declare. + * c-parser.c (c_parser_postfix_expression): Call c_build_va_arg + instead of build_va_arg. + 2009-05-29 Eric Botcazou * tree-ssa-loop-ivopts.c (strip_offset_1) : New case. diff --git a/gcc/builtins.c b/gcc/builtins.c index 6d9f28266899..80ff09d26bd4 100644 --- a/gcc/builtins.c +++ b/gcc/builtins.c @@ -11231,7 +11231,7 @@ validate_gimple_arglist (const_gimple call, ...) do { - code = va_arg (ap, enum tree_code); + code = (enum tree_code) va_arg (ap, int); switch (code) { case 0: @@ -11282,7 +11282,7 @@ validate_arglist (const_tree callexpr, ...) do { - code = va_arg (ap, enum tree_code); + code = (enum tree_code) va_arg (ap, int); switch (code) { case 0: diff --git a/gcc/c-parser.c b/gcc/c-parser.c index 0320feece40b..244c238023d2 100644 --- a/gcc/c-parser.c +++ b/gcc/c-parser.c @@ -5338,6 +5338,7 @@ c_parser_postfix_expression (c_parser *parser) expr.value = error_mark_node; break; } + loc = c_parser_peek_token (parser)->location; t1 = c_parser_type_name (parser); c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>"); @@ -5348,9 +5349,9 @@ c_parser_postfix_expression (c_parser *parser) else { tree type_expr = NULL_TREE; - expr.value = build_va_arg (e1.value, groktypename (t1, - &type_expr, - NULL)); + expr.value = c_build_va_arg (e1.value, + groktypename (t1, &type_expr, NULL), + loc); if (type_expr) { expr.value = build2 (C_MAYBE_CONST_EXPR, diff --git a/gcc/c-tree.h b/gcc/c-tree.h index 6062d59982d3..05b52d8a45cf 100644 --- a/gcc/c-tree.h +++ b/gcc/c-tree.h @@ -650,6 +650,7 @@ extern tree c_finish_omp_parallel (tree, tree); extern tree c_begin_omp_task (void); extern tree c_finish_omp_task (tree, tree); extern tree c_finish_omp_clauses (tree); +extern tree c_build_va_arg (tree, tree, location_t); /* Set to 0 at beginning of a function definition, set to 1 if a return statement that specifies a return value is seen. */ diff --git a/gcc/c-typeck.c b/gcc/c-typeck.c index 1a1b009398cf..43cb6f30cc87 100644 --- a/gcc/c-typeck.c +++ b/gcc/c-typeck.c @@ -9976,3 +9976,14 @@ c_build_qualified_type (tree type, int type_quals) return build_qualified_type (type, type_quals); } + +/* Build a VA_ARG_EXPR for the C parser. */ + +tree +c_build_va_arg (tree expr, tree type, location_t loc) +{ + if (warn_cxx_compat && TREE_CODE (type) == ENUMERAL_TYPE) + warning_at (loc, OPT_Wc___compat, + "C++ requires promoted type, not enum type, in %"); + return build_va_arg (expr, type); +} diff --git a/gcc/calls.c b/gcc/calls.c index 219b1d3afa6f..c10b0cd3abad 100644 --- a/gcc/calls.c +++ b/gcc/calls.c @@ -3445,7 +3445,7 @@ emit_library_call_value_1 (int retval, rtx orgfun, rtx value, for (; count < nargs; count++) { rtx val = va_arg (p, rtx); - enum machine_mode mode = va_arg (p, enum machine_mode); + enum machine_mode mode = (enum machine_mode) va_arg (p, int); /* We cannot convert the arg value to the mode the library wants here; must do it earlier where we know the signedness of the arg. */ diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 11be689a536b..e7e223ed2a43 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,7 @@ +2009-05-29 Ian Lance Taylor + + * error.c (cp_printer): Don't use va_arg with enum type. + 2009-05-28 Dodji Seketeli PR c++/39754 diff --git a/gcc/cp/error.c b/gcc/cp/error.c index 0bfb28e89648..004543dd2103 100644 --- a/gcc/cp/error.c +++ b/gcc/cp/error.c @@ -2761,8 +2761,8 @@ cp_printer (pretty_printer *pp, text_info *text, const char *spec, const char *result; tree t = NULL; #define next_tree (t = va_arg (*text->args_ptr, tree)) -#define next_tcode va_arg (*text->args_ptr, enum tree_code) -#define next_lang va_arg (*text->args_ptr, enum languages) +#define next_tcode ((enum tree_code) va_arg (*text->args_ptr, int)) +#define next_lang ((enum languages) va_arg (*text->args_ptr, int)) #define next_int va_arg (*text->args_ptr, int) if (precision != 0 || wide) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 214cf74523eb..a78c416af544 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2009-05-29 Ian Lance Taylor + + * gcc.dg/Wcxx-compat-11.c: New testcase. + 2009-05-29 Francois-Xavier Coudert PR fortran/40019 diff --git a/gcc/testsuite/gcc.dg/Wcxx-compat-11.c b/gcc/testsuite/gcc.dg/Wcxx-compat-11.c new file mode 100644 index 000000000000..8818338ad5e5 --- /dev/null +++ b/gcc/testsuite/gcc.dg/Wcxx-compat-11.c @@ -0,0 +1,21 @@ +/* { dg-do compile } */ +/* { dg-options "-Wc++-compat" } */ + +#include + +enum E { A }; + +extern void f2 (int); +void +f1 (int n, ...) +{ + va_list ap; + + va_start (ap, n); + f2 (va_arg (ap, int)); + f2 (va_arg (ap, _Bool)); /* { dg-warning "promoted" } */ + f2 (va_arg (ap, enum E)); /* { dg-warning "promoted" } */ +} + +/* Match extra informative notes. */ +/* { dg-message "note:" "expected" { target *-*-* } 0 } */