OSDN Git Service

* cp-tree.def: Add SRCLOC.
authorjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 23 May 1998 02:18:33 +0000 (02:18 +0000)
committerjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 23 May 1998 02:18:33 +0000 (02:18 +0000)
* cp-tree.h: Add struct tree_srcloc and accessor macros.
* tree.c (build_srcloc, build_srcloc_here): New fns.
* pt.c (add_pending_template): Use build_srcloc_here.
(push_tinst_level): Update last_template_error_tick before erroring.
(instantiate_decl): Restore lineno and input_filename before
calling add_pending_template.
* decl2.c (finish_file): Set up lineno and input_filename for
pending templates.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@19967 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/cp/ChangeLog
gcc/cp/cp-tree.def
gcc/cp/cp-tree.h
gcc/cp/decl2.c
gcc/cp/pt.c
gcc/cp/tree.c

index 023f457..341db45 100644 (file)
@@ -1,3 +1,15 @@
+1998-05-23  Jason Merrill  <jason@yorick.cygnus.com>
+
+       * cp-tree.def: Add SRCLOC.
+       * cp-tree.h: Add struct tree_srcloc and accessor macros.
+       * tree.c (build_srcloc, build_srcloc_here): New fns.
+       * pt.c (add_pending_template): Use build_srcloc_here.
+       (push_tinst_level): Update last_template_error_tick before erroring.
+       (instantiate_decl): Restore lineno and input_filename before 
+       calling add_pending_template.
+       * decl2.c (finish_file): Set up lineno and input_filename for
+       pending templates.
+
 1998-05-22  Jason Merrill  <jason@yorick.cygnus.com>
 
        * decl.c (lang_print_error_function): New fn.  
index 2124a04..cad0a59 100644 (file)
@@ -179,6 +179,9 @@ DEFTREECODE (OVERLOAD, "overload", 'x', 1)
    tree structure.  */
 DEFTREECODE (WRAPPER, "wrapper", 'x', 1)
 
+/* A node to remember a source position.  */
+DEFTREECODE (SRCLOC, "srcloc", 'x', 2)
+
 /* A whole bunch of tree codes for the initial, superficial parsing of
    templates.  */
 DEFTREECODE (LOOKUP_EXPR, "lookup_expr", 'e', 2)
index 3cde102..f12a82e 100644 (file)
@@ -166,6 +166,15 @@ struct tree_wrapper
   } u;
 };
 
+#define SRCLOC_FILE(NODE) (((struct tree_srcloc*)NODE)->filename)
+#define SRCLOC_LINE(NODE) (((struct tree_srcloc*)NODE)->linenum)
+struct tree_srcloc
+{
+  char common[sizeof (struct tree_common)];
+  char *filename;
+  int linenum;
+};
+
 /* To identify to the debug emitters if it should pay attention to the
    flag `-Wtemplate-debugging'.  */
 #define HAVE_TEMPLATES 1
@@ -2823,6 +2832,8 @@ extern tree make_temp_vec                 PROTO((int));
 extern tree build_ptr_wrapper                  PROTO((void *));
 extern tree build_expr_ptr_wrapper             PROTO((void *));
 extern tree build_int_wrapper                  PROTO((int));
+extern tree build_srcloc                       PROTO((char *, int));
+extern tree build_srcloc_here                  PROTO((void));
 extern int varargs_function_p                  PROTO((tree));
 extern int really_overloaded_fn                        PROTO((tree));
 extern int cp_tree_equal                       PROTO((tree, tree));
index 3190341..2ad9bbe 100644 (file)
@@ -3086,7 +3086,12 @@ finish_file ()
 
   for (fnname = pending_templates; fnname; fnname = TREE_CHAIN (fnname))
     {
+      tree srcloc = TREE_PURPOSE (fnname);
       tree decl = TREE_VALUE (fnname);
+
+      input_filename = SRCLOC_FILE (srcloc);
+      lineno = SRCLOC_LINE (srcloc);
+
       if (TREE_CODE_CLASS (TREE_CODE (decl)) == 't')
        {
          instantiate_class_template (decl);
index 920e062..d148e0d 100644 (file)
@@ -2775,7 +2775,7 @@ add_pending_template (d)
     return;
 
   *template_tail = perm_tree_cons
-    (current_function_decl, d, NULL_TREE);
+    (build_srcloc_here (), d, NULL_TREE);
   template_tail = &TREE_CHAIN (*template_tail);
   TI_PENDING_TEMPLATE_FLAG (ti) = 1;
 }
@@ -3346,8 +3346,8 @@ print_template_context (err)
       if (current_function_decl == p->decl)
        /* Avoid redundancy with the the "In function" line.  */;
       else if (current_function_decl == NULL_TREE)
-       fprintf (stderr, "In instantiation of `%s':\n",
-                decl_as_string (p->decl, 0));
+       fprintf (stderr, "%s: In instantiation of `%s':\n",
+                file, decl_as_string (p->decl, 0));
       else
        my_friendly_abort (980521);
 
@@ -3397,6 +3397,7 @@ push_tinst_level (d)
       if (uses_template_parms (d))
        return 0;
 
+      last_template_error_tick = tinst_level_tick;
       error ("template instantiation depth exceeds maximum of %d",
             max_tinst_depth);
       error (" (use -ftemplate-depth-NN to increase the maximum)");
@@ -7127,6 +7128,9 @@ instantiate_decl (d)
       || (! (TREE_CODE (d) == FUNCTION_DECL && DECL_INLINE (d) && nested)
          && ! at_eof))
     {
+      lineno = line;
+      input_filename = file;
+
       add_pending_template (d);
       goto out;
     }
index 60d20b3..ce60118 100644 (file)
@@ -2267,6 +2267,23 @@ build_int_wrapper (i)
   return t;
 }
 
+tree
+build_srcloc (file, line)
+     char *file;
+     int line;
+{
+  tree t = make_node (SRCLOC);
+  SRCLOC_FILE (t) = file;
+  SRCLOC_LINE (t) = line;
+  return t;
+}
+
+tree
+build_srcloc_here ()
+{
+  return build_srcloc (input_filename, lineno);
+}
+
 void
 push_expression_obstack ()
 {