pt.c (tinst_level_tick, [...]): Replace with last_error_tinst_level.
authorJason Merrill <jason@redhat.com>
Sun, 17 Jul 2011 02:34:22 +0000 (22:34 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Sun, 17 Jul 2011 02:34:22 +0000 (22:34 -0400)
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

gcc/cp/ChangeLog
gcc/cp/error.c
gcc/cp/pt.c
gcc/testsuite/ChangeLog
gcc/testsuite/lib/prune.exp
libstdc++-v3/testsuite/20_util/shared_ptr/assign/shared_ptr_neg.cc
libstdc++-v3/testsuite/tr1/2_general_utilities/shared_ptr/assign/shared_ptr_neg.cc

index 4db0c7e89208f6606939c95278bdbde2652001cb..d27ba873d6eeb51b1a5165176d5b6decc9e172b7 100644 (file)
@@ -1,3 +1,14 @@
+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>
 
index b16fce687507254c12455d2617fd1f1695cf04ef..2d7c0f1f0b616de16411f43f129fd5b503bc4d0d 100644 (file)
@@ -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);
index a93f677c8419ff0939d4efc2136ecfc3c7377d90..f34e1df818b553f626dbfaf6586716d56307fcc2 100644 (file)
@@ -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 *
index 1c00214e92974829b7056a5548027f39ba41d7d5..ffecc486dc7ce228d9f6b382e8f19af898d61b22 100644 (file)
@@ -1,3 +1,7 @@
+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>
 
index f5cbc4ca62ed50b94943fda0a992c10ce830a78f..4683f9315896e5ffdaedb7459f0968c2d8af9590 100644 (file)
@@ -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
index a56148a3f9a7f64fe76837e10dc284214ad4960e..a884d0171df8a6f3e9aa1a0bdfd4fa4410960cce 100644 (file)
@@ -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 }
index 8114531e2d71f397a86862dd4c659cdabe277025..ec41e5be85284443326e4b0c0d358226d8d64ca9 100644 (file)
@@ -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 }