diff options
author | Richard Guenther <rguenther@suse.de> | 2011-03-15 13:39:28 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2011-03-15 13:39:28 +0000 |
commit | 930672adb7c3ae012e0af46eb19b0e8de1974cfb (patch) | |
tree | 21dbe136eadd04262c13f6f277122dfec08e0839 /gcc/tree-pretty-print.c | |
parent | c7ee7b4534f5730263f9d653d4c8d58c3ea02acf (diff) | |
download | gcc-930672adb7c3ae012e0af46eb19b0e8de1974cfb.zip gcc-930672adb7c3ae012e0af46eb19b0e8de1974cfb.tar.gz gcc-930672adb7c3ae012e0af46eb19b0e8de1974cfb.tar.bz2 |
re PR middle-end/47650 (wrong output of print_generic_decl() called from a plugin)
2011-03-15 Richard Guenther <rguenther@suse.de>
PR middle-end/47650
* tree-pretty-print.c (dump_function_declaration): Properly
dump unprototyped and varargs function types.
* gfortran.dg/c_f_pointer_tests_3.f90: Adjust.
* gfortran.dg/ishft_4.f90: Likewise.
* gfortran.dg/leadz_trailz_3.f90: Likewise.
From-SVN: r170995
Diffstat (limited to 'gcc/tree-pretty-print.c')
-rw-r--r-- | gcc/tree-pretty-print.c | 20 |
1 files changed, 12 insertions, 8 deletions
diff --git a/gcc/tree-pretty-print.c b/gcc/tree-pretty-print.c index 12ef388..f2f5a22 100644 --- a/gcc/tree-pretty-print.c +++ b/gcc/tree-pretty-print.c @@ -232,23 +232,27 @@ dump_function_declaration (pretty_printer *buffer, tree node, pp_space (buffer); pp_character (buffer, '('); - /* Print the argument types. The last element in the list is a VOID_TYPE. - The following avoids printing the last element. */ + /* Print the argument types. */ arg = TYPE_ARG_TYPES (node); - while (arg && TREE_CHAIN (arg) && arg != error_mark_node) + while (arg && arg != void_list_node && arg != error_mark_node) { - wrote_arg = true; - dump_generic_node (buffer, TREE_VALUE (arg), spc, flags, false); - arg = TREE_CHAIN (arg); - if (TREE_CHAIN (arg) && TREE_CODE (TREE_CHAIN (arg)) == TREE_LIST) + if (wrote_arg) { pp_character (buffer, ','); pp_space (buffer); } + wrote_arg = true; + dump_generic_node (buffer, TREE_VALUE (arg), spc, flags, false); + arg = TREE_CHAIN (arg); } - if (!wrote_arg) + /* Drop the trailing void_type_node if we had any previous argument. */ + if (arg == void_list_node && !wrote_arg) pp_string (buffer, "void"); + /* Properly dump vararg function types. */ + else if (!arg && wrote_arg) + pp_string (buffer, ", ..."); + /* Avoid printing any arg for unprototyped functions. */ pp_character (buffer, ')'); } |