diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 504a0c36d285f0f28cd00ad9419b7c630d629da1..6f9e04d48f4551accf0f7cbd21e552fb3ab4f9f8 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,11 @@ +2007-09-18 Paolo Carlini <pcarlini@suse.de> + + 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 <pcarlini@suse.de> PR c++/33463 diff --git a/gcc/cp/cxx-pretty-print.c b/gcc/cp/cxx-pretty-print.c index a73a052572b979b509c4760c0bf9490f0ae4a30e..b660f5347649147bc3589426e598bcc58487219d 100644 --- a/gcc/cp/cxx-pretty-print.c +++ b/gcc/cp/cxx-pretty-print.c @@ -351,6 +351,8 @@ pp_cxx_id_expression (cxx_pretty_printer *pp, tree t) id-expression GNU Extensions: + __builtin_va_arg ( assignment-expression , type-id ) + __has_nothrow_assign ( type-id ) __has_nothrow_constructor ( type-id ) __has_nothrow_copy ( type-id ) @@ -410,6 +412,10 @@ pp_cxx_primary_expression (cxx_pretty_printer *pp, tree t) pp_cxx_trait_expression (pp, t); break; + case VA_ARG_EXPR: + pp_cxx_va_arg_expression (pp, t); + break; + default: pp_c_primary_expression (pp_c_base (pp), t); break; @@ -2152,6 +2158,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, "__builtin_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); +} + void pp_cxx_trait_expression (cxx_pretty_printer *pp, tree t) { diff --git a/gcc/cp/cxx-pretty-print.h b/gcc/cp/cxx-pretty-print.h index f399feafaa4d4307eec56285438592df87aef8eb..b653376447803f3f678b314d35114b2d7deb1476 100644 --- a/gcc/cp/cxx-pretty-print.h +++ b/gcc/cp/cxx-pretty-print.h @@ -71,5 +71,6 @@ void pp_cxx_declaration (cxx_pretty_printer *, tree); void pp_cxx_canonical_template_parameter (cxx_pretty_printer *, tree); void pp_cxx_trait_expression (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 1854fd6888cf7536ee3580c8554daacf75c3737d..602426a79a1477b39fa477f5b3e1826c742c5899 100644 --- a/gcc/cp/error.c +++ b/gcc/cp/error.c @@ -2062,6 +2062,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 4cf9eb53d557d85d32425f132f8c9714c45e5f10..24f18f47727efadefe47bf9eec54eccc186e5034 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2007-09-18 Paolo Carlini <pcarlini@suse.de> + + PR c++/33462 + * g++.dg/ext/va-arg1.C: New. + 2007-09-18 Tobias Burnus <burnus@net-b.de> * gfortran.dg/elemental_optional_args_1.f90: Fix test. 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 0000000000000000000000000000000000000000..5e76d45da1292429426f92c0227fb8c8dbf655b9 --- /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 "'\\+\\+__builtin_va_arg\\(0, A\\)'" } +}