From: Jason Merrill Date: Sun, 17 Jul 2011 02:34:22 +0000 (-0400) Subject: pt.c (tinst_level_tick, [...]): Replace with last_error_tinst_level. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=6573e8a0a9a5242a30cafc7290e9d6449a8cee52;p=gcc.git pt.c (tinst_level_tick, [...]): Replace with last_error_tinst_level. gcc/cp/ * pt.c (tinst_level_tick, last_template_error_tick): Replace with last_error_tinst_level. (push_tinst_level, pop_tinst_level): Adjust. (problematic_instantiation_changed): Adjust. (record_last_problematic_instantiation): Adjust. * error.c (cp_print_error_function): Don't print current_function_decl if we're in a template instantiation context. (print_instantiation_full_context): Always print first line. gcc/testsuite/ * lib/prune.exp (prune_gcc_output): Prune "In substitution" too. From-SVN: r176366 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 4db0c7e8920..d27ba873d6e 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,14 @@ +2011-07-16 Jason Merrill + + * pt.c (tinst_level_tick, last_template_error_tick): Replace with + last_error_tinst_level. + (push_tinst_level, pop_tinst_level): Adjust. + (problematic_instantiation_changed): Adjust. + (record_last_problematic_instantiation): Adjust. + * error.c (cp_print_error_function): Don't print + current_function_decl if we're in a template instantiation context. + (print_instantiation_full_context): Always print first line. + 2011-07-16 Nathan Froyd Jason Merrill diff --git a/gcc/cp/error.c b/gcc/cp/error.c index b16fce68750..2d7c0f1f0b6 100644 --- a/gcc/cp/error.c +++ b/gcc/cp/error.c @@ -2784,6 +2784,10 @@ static void cp_print_error_function (diagnostic_context *context, diagnostic_info *diagnostic) { + /* If we are in an instantiation context, current_function_decl is likely + to be wrong, so just rely on print_instantiation_full_context. */ + if (current_instantiation ()) + return; if (diagnostic_last_function_changed (context, diagnostic)) { const char *old_prefix = context->printer->prefix; @@ -2927,26 +2931,15 @@ print_instantiation_full_context (diagnostic_context *context) if (p) { - if (current_function_decl != p->decl - && current_function_decl != NULL_TREE) - /* We can get here during the processing of some synthesized - method. Then, P->DECL will be the function that's causing - the synthesis. */ - ; - else - { - if (current_function_decl == p->decl) - /* Avoid redundancy with the "In function" line. */; - else - pp_verbatim (context->printer, - _("%s: In instantiation of %qs:\n"), - LOCATION_FILE (location), - decl_as_string_translate (p->decl, - TFF_DECL_SPECIFIERS | TFF_RETURN_TYPE)); - - location = p->locus; - p = p->next; - } + pp_verbatim (context->printer, + TREE_CODE (p->decl) == TREE_LIST + ? _("%s: In substitution of %qS:\n") + : _("%s: In instantiation of %q#D:\n"), + LOCATION_FILE (location), + p->decl); + + location = p->locus; + p = p->next; } print_instantiation_partial_context (context, p, location); diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index a93f677c841..f34e1df818b 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -7766,8 +7766,7 @@ extern int max_tinst_depth; #ifdef GATHER_STATISTICS int depth_reached; #endif -static int tinst_level_tick; -static int last_template_error_tick; +static GTY(()) struct tinst_level *last_error_tinst_level; /* We're starting to instantiate D; record the template instantiation context for diagnostics and to restore it later. */ @@ -7779,7 +7778,7 @@ push_tinst_level (tree d) if (tinst_depth >= max_tinst_depth) { - last_template_error_tick = tinst_level_tick; + last_error_tinst_level = current_tinst_level; if (TREE_CODE (d) == TREE_LIST) error ("template instantiation depth exceeds maximum of %d (use " "-ftemplate-depth= to increase the maximum) substituting %qS", @@ -7814,7 +7813,6 @@ push_tinst_level (tree d) depth_reached = tinst_depth; #endif - ++tinst_level_tick; return 1; } @@ -7829,7 +7827,6 @@ pop_tinst_level (void) input_location = current_tinst_level->locus; current_tinst_level = current_tinst_level->next; --tinst_depth; - ++tinst_level_tick; } /* We're instantiating a deferred template; restore the template @@ -13961,6 +13958,7 @@ deduction_tsubst_fntype (tree fn, tree targs, tsubst_flags_t complain) static bool excessive_deduction_depth; static int deduction_depth; struct pending_template *old_last_pend = last_pending_template; + struct tinst_level *old_error_tinst = last_error_tinst_level; tree fntype = TREE_TYPE (fn); tree tinst; @@ -13993,8 +13991,10 @@ deduction_tsubst_fntype (tree fn, tree targs, tsubst_flags_t complain) } pop_tinst_level (); - /* We can't free this if a pending_template entry is pointing at it. */ - if (last_pending_template == old_last_pend) + /* We can't free this if a pending_template entry or last_error_tinst_level + is pointing at it. */ + if (last_pending_template == old_last_pend + && last_error_tinst_level == old_error_tinst) ggc_free (tinst); return r; } @@ -18564,14 +18564,14 @@ get_mostly_instantiated_function_type (tree decl) int problematic_instantiation_changed (void) { - return last_template_error_tick != tinst_level_tick; + return current_tinst_level != last_error_tinst_level; } /* Remember current template involved in diagnostics. */ void record_last_problematic_instantiation (void) { - last_template_error_tick = tinst_level_tick; + last_error_tinst_level = current_tinst_level; } struct tinst_level * diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 1c00214e929..ffecc486dc7 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2011-07-16 Jason Merrill + + * lib/prune.exp (prune_gcc_output): Prune "In substitution" too. + 2011-07-16 Nathan Froyd Jason Merrill diff --git a/gcc/testsuite/lib/prune.exp b/gcc/testsuite/lib/prune.exp index f5cbc4ca62e..4683f931589 100644 --- a/gcc/testsuite/lib/prune.exp +++ b/gcc/testsuite/lib/prune.exp @@ -20,7 +20,7 @@ proc prune_gcc_output { text } { #send_user "Before:$text\n" - regsub -all "(^|\n)(\[^\n\]*: )?In ((static member |lambda )?function|member|method|(copy )?constructor|destructor|instantiation|program|subroutine|block-data)\[^\n\]*" $text "" text + regsub -all "(^|\n)(\[^\n\]*: )?In ((static member |lambda )?function|member|method|(copy )?constructor|destructor|instantiation|substitution|program|subroutine|block-data)\[^\n\]*" $text "" text regsub -all "(^|\n)\[^\n\]*(: )?At (top level|global scope):\[^\n\]*" $text "" text regsub -all "(^|\n)\[^\n\]*: (recursively )?required \[^\n\]*" $text "" text regsub -all "(^|\n)\[^\n\]*: . skipping \[0-9\]* instantiation contexts \[^\n\]*" $text "" text diff --git a/libstdc++-v3/testsuite/20_util/shared_ptr/assign/shared_ptr_neg.cc b/libstdc++-v3/testsuite/20_util/shared_ptr/assign/shared_ptr_neg.cc index a56148a3f9a..a884d0171df 100644 --- a/libstdc++-v3/testsuite/20_util/shared_ptr/assign/shared_ptr_neg.cc +++ b/libstdc++-v3/testsuite/20_util/shared_ptr/assign/shared_ptr_neg.cc @@ -47,6 +47,6 @@ main() test01(); return 0; } -// { dg-error "In member function" "" { target *-*-* } 0 } +// { dg-error "In instantiation" "" { target *-*-* } 0 } // { dg-error "cannot convert" "" { target *-*-* } 0 } // { dg-error "required from" "" { target *-*-* } 0 } diff --git a/libstdc++-v3/testsuite/tr1/2_general_utilities/shared_ptr/assign/shared_ptr_neg.cc b/libstdc++-v3/testsuite/tr1/2_general_utilities/shared_ptr/assign/shared_ptr_neg.cc index 8114531e2d7..ec41e5be852 100644 --- a/libstdc++-v3/testsuite/tr1/2_general_utilities/shared_ptr/assign/shared_ptr_neg.cc +++ b/libstdc++-v3/testsuite/tr1/2_general_utilities/shared_ptr/assign/shared_ptr_neg.cc @@ -46,6 +46,6 @@ main() test01(); return 0; } -// { dg-error "In member function" "" { target *-*-* } 0 } +// { dg-error "In instantiation" "" { target *-*-* } 0 } // { dg-error "cannot convert" "" { target *-*-* } 0 } // { dg-error "required from" "" { target *-*-* } 0 }