+2011-07-16 Jason Merrill <jason@redhat.com>
+
+ * 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 <froydnj@codesourcery.com>
Jason Merrill <jason@redhat.com>
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;
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);
#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. */
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",
depth_reached = tinst_depth;
#endif
- ++tinst_level_tick;
return 1;
}
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
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;
}
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;
}
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 *
+2011-07-16 Jason Merrill <jason@redhat.com>
+
+ * lib/prune.exp (prune_gcc_output): Prune "In substitution" too.
+
2011-07-16 Nathan Froyd <froydnj@codesourcery.com>
Jason Merrill <jason@redhat.com>
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
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 }
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 }