X-Git-Url: http://git.sourceforge.jp/view?a=blobdiff_plain;f=gcc%2Fcp%2Ferror.c;h=b77a94c4ba8d64f0a54fab7dffaa841ad889e8ab;hb=8361337727f7909ff99c9bf64f96abc249ad1512;hp=e2cb8bf0ecc5880be4517c7ed2f1e2bd7b465b02;hpb=6ce18e5b46472b2623e3f0b1514eae2882e55b74;p=pf3gnuchains%2Fgcc-fork.git diff --git a/gcc/cp/error.c b/gcc/cp/error.c index e2cb8bf0ecc..b77a94c4ba8 100644 --- a/gcc/cp/error.c +++ b/gcc/cp/error.c @@ -29,7 +29,9 @@ along with GCC; see the file COPYING3. If not see #include "flags.h" #include "diagnostic.h" #include "langhooks-def.h" +#include "intl.h" #include "cxx-pretty-print.h" +#include "pointer-set.h" #define pp_separate_with_comma(PP) pp_cxx_separate_with (PP, ',') @@ -39,6 +41,10 @@ along with GCC; see the file COPYING3. If not see static cxx_pretty_printer scratch_pretty_printer; #define cxx_pp (&scratch_pretty_printer) +/* Translate if being used for diagnostics, but not for dump files or + __PRETTY_FUNCTION. */ +#define M_(msgid) (pp_translate_identifiers (cxx_pp) ? _(msgid) : (msgid)) + # define NEXT_CODE(T) (TREE_CODE (TREE_TYPE (T))) static const char *args_to_string (tree, int); @@ -74,10 +80,10 @@ static void dump_exception_spec (tree, int); static void dump_template_argument (tree, int); static void dump_template_argument_list (tree, int); static void dump_template_parameter (tree, int); -static void dump_template_bindings (tree, tree); +static void dump_template_bindings (tree, tree, VEC(tree,gc) *); static void dump_scope (tree, int); static void dump_template_parms (tree, int, int); - +static int get_non_default_template_args_count (tree, int); static const char *function_category (tree); static void maybe_print_instantiation_context (diagnostic_context *); static void print_instantiation_full_context (diagnostic_context *); @@ -151,17 +157,37 @@ dump_template_argument (tree arg, int flags) } } +/* Count the number of template arguments ARGS whose value does not + match the (optional) default template parameter in PARAMS */ + +static int +get_non_default_template_args_count (tree args, int flags) +{ + int n = TREE_VEC_LENGTH (INNERMOST_TEMPLATE_ARGS (args)); + + if (/* We use this flag when generating debug information. We don't + want to expand templates at this point, for this may generate + new decls, which gets decl counts out of sync, which may in + turn cause codegen differences between compilations with and + without -g. */ + (flags & TFF_NO_OMIT_DEFAULT_TEMPLATE_ARGUMENTS) != 0 + || !flag_pretty_templates) + return n; + + return GET_NON_DEFAULT_TEMPLATE_ARGS_COUNT (INNERMOST_TEMPLATE_ARGS (args)); +} + /* Dump a template-argument-list ARGS (always a TREE_VEC) under control of FLAGS. */ static void dump_template_argument_list (tree args, int flags) { - int n = TREE_VEC_LENGTH (args); + int n = get_non_default_template_args_count (args, flags); int need_comma = 0; int i; - for (i = 0; i< n; ++i) + for (i = 0; i < n; ++i) { tree arg = TREE_VEC_ELT (args, i); @@ -196,9 +222,9 @@ dump_template_parameter (tree parm, int flags) { if (flags & TFF_DECL_SPECIFIERS) { - pp_cxx_identifier (cxx_pp, "class"); + pp_cxx_ws_string (cxx_pp, "class"); if (TEMPLATE_TYPE_PARAMETER_PACK (TREE_TYPE (p))) - pp_cxx_identifier (cxx_pp, "..."); + pp_cxx_ws_string (cxx_pp, "..."); if (DECL_NAME (p)) pp_cxx_tree_identifier (cxx_pp, DECL_NAME (p)); } @@ -227,9 +253,11 @@ dump_template_parameter (tree parm, int flags) TREE_VEC. */ static void -dump_template_bindings (tree parms, tree args) +dump_template_bindings (tree parms, tree args, VEC(tree,gc)* typenames) { int need_comma = 0; + int i; + tree t; while (parms) { @@ -237,18 +265,19 @@ dump_template_bindings (tree parms, tree args) int lvl = TMPL_PARMS_DEPTH (parms); int arg_idx = 0; int i; + tree lvl_args = NULL_TREE; + + /* Don't crash if we had an invalid argument list. */ + if (TMPL_ARGS_DEPTH (args) >= lvl) + lvl_args = TMPL_ARGS_LEVEL (args, lvl); for (i = 0; i < TREE_VEC_LENGTH (p); ++i) { tree arg = NULL_TREE; /* Don't crash if we had an invalid argument list. */ - if (TMPL_ARGS_DEPTH (args) >= lvl) - { - tree lvl_args = TMPL_ARGS_LEVEL (args, lvl); - if (NUM_TMPL_ARGS (lvl_args) > arg_idx) - arg = TREE_VEC_ELT (lvl_args, arg_idx); - } + if (lvl_args && NUM_TMPL_ARGS (lvl_args) > arg_idx) + arg = TREE_VEC_ELT (lvl_args, arg_idx); if (need_comma) pp_separate_with_comma (cxx_pp); @@ -257,9 +286,15 @@ dump_template_bindings (tree parms, tree args) pp_equal (cxx_pp); pp_cxx_whitespace (cxx_pp); if (arg) - dump_template_argument (arg, TFF_PLAIN_IDENTIFIER); + { + if (ARGUMENT_PACK_P (arg)) + pp_cxx_left_brace (cxx_pp); + dump_template_argument (arg, TFF_PLAIN_IDENTIFIER); + if (ARGUMENT_PACK_P (arg)) + pp_cxx_right_brace (cxx_pp); + } else - pp_identifier (cxx_pp, ""); + pp_string (cxx_pp, M_("")); ++arg_idx; need_comma = 1; @@ -267,6 +302,21 @@ dump_template_bindings (tree parms, tree args) parms = TREE_CHAIN (parms); } + + for (i = 0; VEC_iterate (tree, typenames, i, t); ++i) + { + if (need_comma) + pp_separate_with_comma (cxx_pp); + dump_type (t, TFF_PLAIN_IDENTIFIER); + pp_cxx_whitespace (cxx_pp); + pp_equal (cxx_pp); + pp_cxx_whitespace (cxx_pp); + t = tsubst (t, args, tf_none, NULL_TREE); + /* Strip typedefs. We can't just use TFF_CHASE_TYPEDEF because + pp_simple_type_specifier doesn't know about it. */ + t = strip_typedefs (t); + dump_type (t, TFF_PLAIN_IDENTIFIER); + } } /* Dump a human-readable equivalent of TYPE. FLAGS controls the @@ -283,11 +333,16 @@ dump_type (tree t, int flags) switch (TREE_CODE (t)) { - case UNKNOWN_TYPE: + case LANG_TYPE: if (t == init_list_type_node) - pp_identifier (cxx_pp, ""); + pp_string (cxx_pp, M_("")); + else if (t == unknown_type_node) + pp_string (cxx_pp, M_("")); else - pp_identifier (cxx_pp, ""); + { + pp_cxx_cv_qualifier_seq (cxx_pp, t); + pp_cxx_tree_identifier (cxx_pp, TYPE_IDENTIFIER (t)); + } break; case TREE_LIST: @@ -376,8 +431,14 @@ dump_type (tree t, int flags) break; } case TYPENAME_TYPE: + if (! (flags & TFF_CHASE_TYPEDEF) + && DECL_ORIGINAL_TYPE (TYPE_NAME (t))) + { + dump_decl (TYPE_NAME (t), TFF_PLAIN_IDENTIFIER); + break; + } pp_cxx_cv_qualifier_seq (cxx_pp, t); - pp_cxx_identifier (cxx_pp, + pp_cxx_ws_string (cxx_pp, TYPENAME_IS_ENUM_P (t) ? "enum" : TYPENAME_IS_CLASS_P (t) ? "class" : "typename"); @@ -385,14 +446,17 @@ dump_type (tree t, int flags) break; case UNBOUND_CLASS_TEMPLATE: - dump_type (TYPE_CONTEXT (t), flags); - pp_cxx_colon_colon (cxx_pp); - pp_cxx_identifier (cxx_pp, "template"); + if (! (flags & TFF_UNQUALIFIED_NAME)) + { + dump_type (TYPE_CONTEXT (t), flags); + pp_cxx_colon_colon (cxx_pp); + } + pp_cxx_ws_string (cxx_pp, "template"); dump_type (DECL_NAME (TYPE_NAME (t)), flags); break; case TYPEOF_TYPE: - pp_cxx_identifier (cxx_pp, "__typeof__"); + pp_cxx_ws_string (cxx_pp, "__typeof__"); pp_cxx_whitespace (cxx_pp); pp_cxx_left_paren (cxx_pp); dump_expr (TYPEOF_TYPE_EXPR (t), flags & ~TFF_EXPR_IN_PARENS); @@ -401,7 +465,7 @@ dump_type (tree t, int flags) case TYPE_PACK_EXPANSION: dump_type (PACK_EXPANSION_PATTERN (t), flags); - pp_cxx_identifier (cxx_pp, "..."); + pp_cxx_ws_string (cxx_pp, "..."); break; case TYPE_ARGUMENT_PACK: @@ -409,7 +473,7 @@ dump_type (tree t, int flags) break; case DECLTYPE_TYPE: - pp_cxx_identifier (cxx_pp, "decltype"); + pp_cxx_ws_string (cxx_pp, "decltype"); pp_cxx_whitespace (cxx_pp); pp_cxx_left_paren (cxx_pp); dump_expr (DECLTYPE_TYPE_EXPR (t), flags & ~TFF_EXPR_IN_PARENS); @@ -421,7 +485,7 @@ dump_type (tree t, int flags) /* Fall through to error. */ case ERROR_MARK: - pp_identifier (cxx_pp, ""); + pp_string (cxx_pp, M_("")); break; } } @@ -476,16 +540,25 @@ dump_aggr_type (tree t, int flags) pp_cxx_cv_qualifier_seq (cxx_pp, t); if (flags & TFF_CLASS_KEY_OR_ENUM) - pp_cxx_identifier (cxx_pp, variety); - - if (flags & TFF_CHASE_TYPEDEF) - t = TYPE_MAIN_VARIANT (t); + pp_cxx_ws_string (cxx_pp, variety); name = TYPE_NAME (t); if (name) { typdef = !DECL_ARTIFICIAL (name); + + if ((typdef + && ((flags & TFF_CHASE_TYPEDEF) + || (!flag_pretty_templates && DECL_LANG_SPECIFIC (name) + && DECL_TEMPLATE_INFO (name)))) + || DECL_SELF_REFERENCE_P (name)) + { + t = TYPE_MAIN_VARIANT (t); + name = TYPE_NAME (t); + typdef = 0; + } + tmplate = !typdef && TREE_CODE (t) != ENUMERAL_TYPE && TYPE_LANG_SPECIFIC (t) && CLASSTYPE_TEMPLATE_INFO (t) && (TREE_CODE (CLASSTYPE_TI_TEMPLATE (t)) != TEMPLATE_DECL @@ -510,9 +583,18 @@ dump_aggr_type (tree t, int flags) if (name == 0 || ANON_AGGRNAME_P (name)) { if (flags & TFF_CLASS_KEY_OR_ENUM) - pp_identifier (cxx_pp, ""); + pp_string (cxx_pp, M_("")); else - pp_printf (pp_base (cxx_pp), "", variety); + pp_printf (pp_base (cxx_pp), M_(""), variety); + } + else if (LAMBDANAME_P (name)) + { + /* A lambda's "type" is essentially its signature. */ + pp_string (cxx_pp, M_("'); } else pp_cxx_tree_identifier (cxx_pp, name); @@ -550,7 +632,8 @@ dump_type_prefix (tree t, int flags) tree sub = TREE_TYPE (t); dump_type_prefix (sub, flags); - if (TREE_CODE (sub) == ARRAY_TYPE) + if (TREE_CODE (sub) == ARRAY_TYPE + || TREE_CODE (sub) == FUNCTION_TYPE) { pp_cxx_whitespace (cxx_pp); pp_cxx_left_paren (cxx_pp); @@ -585,12 +668,10 @@ dump_type_prefix (tree t, int flags) pp_base (cxx_pp)->padding = pp_before; break; - /* Can only be reached through function pointer -- this would not be - correct if FUNCTION_DECLs used it. */ + /* This can be reached without a pointer when dealing with + templates, e.g. std::is_function. */ case FUNCTION_TYPE: dump_type_prefix (TREE_TYPE (t), flags); - pp_maybe_space (cxx_pp); - pp_cxx_left_paren (cxx_pp); break; case METHOD_TYPE: @@ -618,7 +699,7 @@ dump_type_prefix (tree t, int flags) case TYPE_DECL: case TREE_VEC: case UNION_TYPE: - case UNKNOWN_TYPE: + case LANG_TYPE: case VOID_TYPE: case TYPENAME_TYPE: case COMPLEX_TYPE: @@ -635,7 +716,7 @@ dump_type_prefix (tree t, int flags) pp_unsupported_tree (cxx_pp, t); /* fall through. */ case ERROR_MARK: - pp_identifier (cxx_pp, ""); + pp_string (cxx_pp, M_("")); break; } } @@ -654,17 +735,19 @@ dump_type_suffix (tree t, int flags) case POINTER_TYPE: case REFERENCE_TYPE: case OFFSET_TYPE: - if (TREE_CODE (TREE_TYPE (t)) == ARRAY_TYPE) + if (TREE_CODE (TREE_TYPE (t)) == ARRAY_TYPE + || TREE_CODE (TREE_TYPE (t)) == FUNCTION_TYPE) pp_cxx_right_paren (cxx_pp); dump_type_suffix (TREE_TYPE (t), flags); break; - /* Can only be reached through function pointer. */ case FUNCTION_TYPE: case METHOD_TYPE: { tree arg; - pp_cxx_right_paren (cxx_pp); + if (TREE_CODE (t) == METHOD_TYPE) + /* Can only be reached through a pointer. */ + pp_cxx_right_paren (cxx_pp); arg = TYPE_ARG_TYPES (t); if (TREE_CODE (t) == METHOD_TYPE) arg = TREE_CHAIN (arg); @@ -677,7 +760,7 @@ dump_type_suffix (tree t, int flags) pp_cxx_cv_qualifier_seq (cxx_pp, TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (t)))); else - pp_cxx_cv_qualifier_seq(cxx_pp, t); + pp_cxx_cv_qualifier_seq (cxx_pp, t); dump_exception_spec (TYPE_RAISES_EXCEPTIONS (t), flags); dump_type_suffix (TREE_TYPE (t), flags); break; @@ -696,7 +779,8 @@ dump_type_suffix (tree t, int flags) dump_expr (TREE_OPERAND (max, 0), flags & ~TFF_EXPR_IN_PARENS); else - dump_expr (fold_build2 (PLUS_EXPR, dtype, max, + dump_expr (fold_build2_loc (input_location, + PLUS_EXPR, dtype, max, build_int_cst (dtype, 1)), flags & ~TFF_EXPR_IN_PARENS); } @@ -717,7 +801,7 @@ dump_type_suffix (tree t, int flags) case TYPE_DECL: case TREE_VEC: case UNION_TYPE: - case UNKNOWN_TYPE: + case LANG_TYPE: case VOID_TYPE: case TYPENAME_TYPE: case COMPLEX_TYPE: @@ -743,13 +827,13 @@ dump_global_iord (tree t) const char *p = NULL; if (DECL_GLOBAL_CTOR_P (t)) - p = "initializers"; + p = M_("(static initializers for %s)"); else if (DECL_GLOBAL_DTOR_P (t)) - p = "destructors"; + p = M_("(static destructors for %s)"); else gcc_unreachable (); - pp_printf (pp_base (cxx_pp), "(static %s for %s)", p, input_filename); + pp_printf (pp_base (cxx_pp), p, input_filename); } static void @@ -768,11 +852,11 @@ dump_simple_decl (tree t, tree type, int flags) if ((flags & TFF_DECL_SPECIFIERS) && DECL_TEMPLATE_PARM_P (t) && TEMPLATE_PARM_PARAMETER_PACK (DECL_INITIAL (t))) - pp_identifier (cxx_pp, "..."); + pp_string (cxx_pp, "..."); if (DECL_NAME (t)) dump_decl (DECL_NAME (t), flags); else - pp_identifier (cxx_pp, ""); + pp_string (cxx_pp, M_("")); if (flags & TFF_DECL_SPECIFIERS) dump_type_suffix (type, flags); } @@ -789,24 +873,25 @@ dump_decl (tree t, int flags) { case TYPE_DECL: /* Don't say 'typedef class A' */ - if (DECL_ARTIFICIAL (t)) + if (DECL_ARTIFICIAL (t) && !DECL_SELF_REFERENCE_P (t)) { if ((flags & TFF_DECL_SPECIFIERS) && TREE_CODE (TREE_TYPE (t)) == TEMPLATE_TYPE_PARM) { /* Say `class T' not just `T'. */ - pp_cxx_identifier (cxx_pp, "class"); + pp_cxx_ws_string (cxx_pp, "class"); /* Emit the `...' for a parameter pack. */ if (TEMPLATE_TYPE_PARAMETER_PACK (TREE_TYPE (t))) - pp_cxx_identifier (cxx_pp, "..."); + pp_cxx_ws_string (cxx_pp, "..."); } dump_type (TREE_TYPE (t), flags); break; } - if (flags & TFF_DECL_SPECIFIERS) - pp_cxx_identifier (cxx_pp, "typedef"); + if ((flags & TFF_DECL_SPECIFIERS) + && !DECL_SELF_REFERENCE_P (t)) + pp_cxx_ws_string (cxx_pp, "typedef"); dump_simple_decl (t, DECL_ORIGINAL_TYPE (t) ? DECL_ORIGINAL_TYPE (t) : TREE_TYPE (t), flags); @@ -815,7 +900,7 @@ dump_decl (tree t, int flags) case VAR_DECL: if (DECL_NAME (t) && VTABLE_NAME_P (DECL_NAME (t))) { - pp_string (cxx_pp, "vtable for "); + pp_string (cxx_pp, M_("vtable for ")); gcc_assert (TYPE_P (DECL_CONTEXT (t))); dump_type (DECL_CONTEXT (t), flags); break; @@ -827,7 +912,7 @@ dump_decl (tree t, int flags) break; case RESULT_DECL: - pp_string (cxx_pp, " "); + pp_string (cxx_pp, M_(" ")); dump_simple_decl (t, TREE_TYPE (t), flags); break; @@ -840,14 +925,16 @@ dump_decl (tree t, int flags) dump_scope (CP_DECL_CONTEXT (t), flags); flags &= ~TFF_UNQUALIFIED_NAME; if (DECL_NAME (t) == NULL_TREE) - pp_identifier (cxx_pp, ""); + pp_string (cxx_pp, M_("")); else pp_cxx_tree_identifier (cxx_pp, DECL_NAME (t)); } break; case SCOPE_REF: - pp_expression (cxx_pp, t); + dump_type (TREE_OPERAND (t, 0), flags); + pp_string (cxx_pp, "::"); + dump_decl (TREE_OPERAND (t, 1), flags|TFF_UNQUALIFIED_NAME); break; case ARRAY_REF: @@ -880,7 +967,7 @@ dump_decl (tree t, int flags) case IDENTIFIER_NODE: if (IDENTIFIER_TYPENAME_P (t)) { - pp_cxx_identifier (cxx_pp, "operator"); + pp_cxx_ws_string (cxx_pp, "operator"); /* Not exactly IDENTIFIER_TYPE_VALUE. */ dump_type (TREE_TYPE (t), flags); break; @@ -914,7 +1001,7 @@ dump_decl (tree t, int flags) case FUNCTION_DECL: if (! DECL_LANG_SPECIFIC (t)) - pp_identifier (cxx_pp, ""); + pp_string (cxx_pp, M_("")); else if (DECL_GLOBAL_CTOR_P (t) || DECL_GLOBAL_DTOR_P (t)) dump_global_iord (t); else @@ -953,11 +1040,11 @@ dump_decl (tree t, int flags) else if (DECL_INITIAL (t)) dump_expr (DECL_INITIAL (t), flags | TFF_EXPR_IN_PARENS); else - pp_identifier (cxx_pp, ""); + pp_string (cxx_pp, M_("")); break; case USING_DECL: - pp_cxx_identifier (cxx_pp, "using"); + pp_cxx_ws_string (cxx_pp, "using"); dump_type (USING_DECL_SCOPE (t), flags); pp_cxx_colon_colon (cxx_pp); dump_decl (DECL_NAME (t), flags); @@ -993,7 +1080,7 @@ dump_decl (tree t, int flags) /* Fall through to error. */ case ERROR_MARK: - pp_identifier (cxx_pp, ""); + pp_string (cxx_pp, M_("")); break; } } @@ -1017,7 +1104,7 @@ dump_template_decl (tree t, int flags) tree inner_parms = INNERMOST_TEMPLATE_PARMS (parms); int len = TREE_VEC_LENGTH (inner_parms); - pp_cxx_identifier (cxx_pp, "template"); + pp_cxx_ws_string (cxx_pp, "template"); pp_cxx_begin_template_argument_list (cxx_pp); /* If we've shown the template prefix, we'd better show the @@ -1038,11 +1125,11 @@ dump_template_decl (tree t, int flags) if (DECL_TEMPLATE_TEMPLATE_PARM_P (t)) { /* Say `template class TT' not just `template TT'. */ - pp_cxx_identifier (cxx_pp, "class"); + pp_cxx_ws_string (cxx_pp, "class"); /* If this is a parameter pack, print the ellipsis. */ if (TEMPLATE_TYPE_PARAMETER_PACK (TREE_TYPE (t))) - pp_cxx_identifier (cxx_pp, "..."); + pp_cxx_ws_string (cxx_pp, "..."); } } @@ -1073,6 +1160,54 @@ dump_template_decl (tree t, int flags) } } +/* find_typenames looks through the type of the function template T + and returns a VEC containing any typedefs, decltypes or TYPENAME_TYPEs + it finds. */ + +struct find_typenames_t +{ + struct pointer_set_t *p_set; + VEC (tree,gc) *typenames; +}; + +static tree +find_typenames_r (tree *tp, int *walk_subtrees ATTRIBUTE_UNUSED, void *data) +{ + struct find_typenames_t *d = (struct find_typenames_t *)data; + tree mv = NULL_TREE; + + if (TYPE_P (*tp) && is_typedef_decl (TYPE_NAME (*tp))) + /* Add the type of the typedef without any additional cv-quals. */ + mv = TREE_TYPE (TYPE_NAME (*tp)); + else if (TREE_CODE (*tp) == TYPENAME_TYPE + || TREE_CODE (*tp) == DECLTYPE_TYPE) + /* Add the typename without any cv-qualifiers. */ + mv = TYPE_MAIN_VARIANT (*tp); + + if (mv && (mv == *tp || !pointer_set_insert (d->p_set, mv))) + VEC_safe_push (tree, gc, d->typenames, mv); + + /* Search into class template arguments, which cp_walk_subtrees + doesn't do. */ + if (CLASS_TYPE_P (*tp) && CLASSTYPE_TEMPLATE_INFO (*tp)) + cp_walk_tree (&CLASSTYPE_TI_ARGS (*tp), find_typenames_r, + data, d->p_set); + + return NULL_TREE; +} + +static VEC(tree,gc) * +find_typenames (tree t) +{ + struct find_typenames_t ft; + ft.p_set = pointer_set_create (); + ft.typenames = NULL; + cp_walk_tree (&TREE_TYPE (DECL_TEMPLATE_RESULT (t)), + find_typenames_r, &ft, ft.p_set); + pointer_set_destroy (ft.p_set); + return ft.typenames; +} + /* Pretty print a function decl. There are several ways we want to print a function declaration. The TFF_ bits in FLAGS tells us how to behave. As error can only apply the '#' flag once to give 0 and 1 for V, there @@ -1089,6 +1224,15 @@ dump_function_decl (tree t, int flags) int show_return = flags & TFF_RETURN_TYPE || flags & TFF_DECL_SPECIFIERS; int do_outer_scope = ! (flags & TFF_UNQUALIFIED_NAME); tree exceptions; + VEC(tree,gc) *typenames = NULL; + + if (LAMBDA_FUNCTION_P (t)) + { + /* A lambda's signature is essentially its "type", so defer. */ + gcc_assert (LAMBDA_TYPE_P (DECL_CONTEXT (t))); + dump_type (DECL_CONTEXT (t), flags); + return; + } flags &= ~TFF_UNQUALIFIED_NAME; if (TREE_CODE (t) == TEMPLATE_DECL) @@ -1099,7 +1243,8 @@ dump_function_decl (tree t, int flags) exceptions = TYPE_RAISES_EXCEPTIONS (TREE_TYPE (t)); /* Pretty print template instantiations only. */ - if (DECL_USE_TEMPLATE (t) && DECL_TEMPLATE_INFO (t)) + if (DECL_USE_TEMPLATE (t) && DECL_TEMPLATE_INFO (t) + && flag_pretty_templates) { tree tmpl; @@ -1109,6 +1254,7 @@ dump_function_decl (tree t, int flags) { template_parms = DECL_TEMPLATE_PARMS (tmpl); t = tmpl; + typenames = find_typenames (t); } } @@ -1124,9 +1270,9 @@ dump_function_decl (tree t, int flags) if (!(flags & TFF_DECL_SPECIFIERS)) /* OK */; else if (DECL_STATIC_FUNCTION_P (t)) - pp_cxx_identifier (cxx_pp, "static"); + pp_cxx_ws_string (cxx_pp, "static"); else if (DECL_VIRTUAL_P (t)) - pp_cxx_identifier (cxx_pp, "virtual"); + pp_cxx_ws_string (cxx_pp, "virtual"); /* Print the return type? */ if (show_return) @@ -1174,9 +1320,9 @@ dump_function_decl (tree t, int flags) { pp_cxx_whitespace (cxx_pp); pp_cxx_left_bracket (cxx_pp); - pp_cxx_identifier (cxx_pp, "with"); + pp_cxx_ws_string (cxx_pp, M_("with")); pp_cxx_whitespace (cxx_pp); - dump_template_bindings (template_parms, template_args); + dump_template_bindings (template_parms, template_args, typenames); pp_cxx_right_bracket (cxx_pp); } } @@ -1199,7 +1345,7 @@ dump_parameters (tree parmtypes, int flags) first = 0; if (!parmtypes) { - pp_cxx_identifier (cxx_pp, "..."); + pp_cxx_ws_string (cxx_pp, "..."); break; } @@ -1224,7 +1370,7 @@ dump_exception_spec (tree t, int flags) { if (t) { - pp_cxx_identifier (cxx_pp, "throw"); + pp_cxx_ws_string (cxx_pp, "throw"); pp_cxx_whitespace (cxx_pp); pp_cxx_left_paren (cxx_pp); if (TREE_VALUE (t) != NULL_TREE) @@ -1265,7 +1411,12 @@ dump_function_name (tree t, int flags) /* Don't let the user see __comp_ctor et al. */ if (DECL_CONSTRUCTOR_P (t) || DECL_DESTRUCTOR_P (t)) - name = constructor_name (DECL_CONTEXT (t)); + { + if (LAMBDA_TYPE_P (DECL_CONTEXT (t))) + name = get_identifier (""); + else + name = constructor_name (DECL_CONTEXT (t)); + } if (DECL_DESTRUCTOR_P (t)) { @@ -1280,10 +1431,10 @@ dump_function_name (tree t, int flags) declarations, both will have the same name, yet the types will be different, hence the TREE_TYPE field of the first name will be clobbered by the second. */ - pp_cxx_identifier (cxx_pp, "operator"); + pp_cxx_ws_string (cxx_pp, "operator"); dump_type (TREE_TYPE (TREE_TYPE (t)), flags); } - else if (IDENTIFIER_OPNAME_P (name)) + else if (name && IDENTIFIER_OPNAME_P (name)) pp_cxx_tree_identifier (cxx_pp, name); else dump_decl (name, flags); @@ -1312,16 +1463,13 @@ dump_template_parms (tree info, int primary, int flags) pp_cxx_begin_template_argument_list (cxx_pp); /* Be careful only to print things when we have them, so as not - to crash producing error messages. */ + to crash producing error messages. */ if (args && !primary) { int len, ix; + len = get_non_default_template_args_count (args, flags); - if (TMPL_ARGS_HAVE_MULTIPLE_LEVELS (args)) - args = TREE_VEC_ELT (args, TREE_VEC_LENGTH (args) - 1); - - len = TREE_VEC_LENGTH (args); - + args = INNERMOST_TEMPLATE_ARGS (args); for (ix = 0; ix != len; ix++) { tree arg = TREE_VEC_ELT (args, ix); @@ -1335,7 +1483,7 @@ dump_template_parms (tree info, int primary, int flags) pp_separate_with_comma (cxx_pp); if (!arg) - pp_identifier (cxx_pp, "