From 18d4211a60cf7245abd761409cc5d4c2996b1902 Mon Sep 17 00:00:00 2001 From: Volker Reichelt Date: Wed, 2 Jan 2008 23:44:10 +0000 Subject: [PATCH] Backport: 2007-09-18 Paolo Carlini PR c++/33462 * cxx-pretty-print.c (pp_cxx_va_arg_expression): Add. (pp_cxx_primary_expression): Use it. * cxx-pretty-print.h (pp_cxx_va_arg_expression): Declare. * error.c (dump_expr): Use it. * g++.dg/ext/va-arg1.C: New. From-SVN: r131266 --- gcc/cp/ChangeLog | 8 ++++++++ gcc/cp/cxx-pretty-print.c | 20 +++++++++++++++++++- gcc/cp/cxx-pretty-print.h | 1 + gcc/cp/error.c | 4 ++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/ext/va-arg1.C | 8 ++++++++ 6 files changed, 45 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/g++.dg/ext/va-arg1.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index b4f6477c03db..a794d8ab45fe 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -2,6 +2,14 @@ Backport: 2007-09-18 Paolo Carlini + + PR c++/33462 + * cxx-pretty-print.c (pp_cxx_va_arg_expression): Add. + (pp_cxx_primary_expression): Use it. + * cxx-pretty-print.h (pp_cxx_va_arg_expression): Declare. + * error.c (dump_expr): Use it. + + 2007-09-18 Paolo Carlini PR c++/33463 * cxx-pretty-print.c (pp_cxx_postfix_expression): Split diff --git a/gcc/cp/cxx-pretty-print.c b/gcc/cp/cxx-pretty-print.c index 104701095028..5dfd7af3f926 100644 --- a/gcc/cp/cxx-pretty-print.c +++ b/gcc/cp/cxx-pretty-print.c @@ -348,7 +348,10 @@ pp_cxx_id_expression (cxx_pretty_printer *pp, tree t) :: operator-function-id :: qualifier-id ( expression ) - id-expression */ + id-expression + + GNU Extensions: + __builtin_va_arg ( assignment-expression , type-id ) */ static void pp_cxx_primary_expression (cxx_pretty_printer *pp, tree t) @@ -386,6 +389,10 @@ pp_cxx_primary_expression (cxx_pretty_printer *pp, tree t) pp_cxx_right_paren (pp); break; + case VA_ARG_EXPR: + pp_cxx_va_arg_expression (pp, t); + break; + default: pp_c_primary_expression (pp_c_base (pp), t); break; @@ -1974,6 +1981,17 @@ pp_cxx_typeid_expression (cxx_pretty_printer *pp, tree t) pp_cxx_right_paren (pp); } +void +pp_cxx_va_arg_expression (cxx_pretty_printer *pp, tree t) +{ + pp_cxx_identifier (pp, "va_arg"); + pp_cxx_left_paren (pp); + pp_cxx_assignment_expression (pp, TREE_OPERAND (t, 0)); + pp_cxx_separate_with (pp, ','); + pp_cxx_type_id (pp, TREE_TYPE (t)); + pp_cxx_right_paren (pp); +} + typedef c_pretty_print_fn pp_fun; diff --git a/gcc/cp/cxx-pretty-print.h b/gcc/cp/cxx-pretty-print.h index 5b6272416557..4375936cf4af 100644 --- a/gcc/cp/cxx-pretty-print.h +++ b/gcc/cp/cxx-pretty-print.h @@ -70,6 +70,7 @@ void pp_cxx_separate_with (cxx_pretty_printer *, int); void pp_cxx_declaration (cxx_pretty_printer *, tree); void pp_cxx_canonical_template_parameter (cxx_pretty_printer *, tree); void pp_cxx_typeid_expression (cxx_pretty_printer *, tree); +void pp_cxx_va_arg_expression (cxx_pretty_printer *, tree); #endif /* GCC_CXX_PRETTY_PRINT_H */ diff --git a/gcc/cp/error.c b/gcc/cp/error.c index 60cdc1a509b8..c62af6553cd6 100644 --- a/gcc/cp/error.c +++ b/gcc/cp/error.c @@ -1897,6 +1897,10 @@ dump_expr (tree t, int flags) pp_cxx_typeid_expression (cxx_pp, t); break; + case VA_ARG_EXPR: + pp_cxx_va_arg_expression (cxx_pp, t); + break; + /* This list is incomplete, but should suffice for now. It is very important that `sorry' does not call `report_error_function'. That could cause an infinite loop. */ diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index c053dc4c327d..181938fed90e 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -2,6 +2,11 @@ Backport: 2007-09-18 Paolo Carlini + + PR c++/33462 + * g++.dg/ext/va-arg1.C: New. + + 2007-09-18 Paolo Carlini PR c++/33463 * g++.dg/rtti/typeid6.C: New. diff --git a/gcc/testsuite/g++.dg/ext/va-arg1.C b/gcc/testsuite/g++.dg/ext/va-arg1.C new file mode 100644 index 000000000000..079db2e5c6e1 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/va-arg1.C @@ -0,0 +1,8 @@ +// PR c++/33462 + +struct A {}; + +void foo() +{ + ++__builtin_va_arg(0, A); // { dg-error "'\\+\\+va_arg\\(0, A\\)'" } +} -- 2.47.2