Commit 1139b3d8 by Jason Merrill Committed by Jason Merrill

cp-tree.def: Add SRCLOC.

	* 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.

From-SVN: r19967
parent 62c154ed
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> 1998-05-22 Jason Merrill <jason@yorick.cygnus.com>
* decl.c (lang_print_error_function): New fn. * decl.c (lang_print_error_function): New fn.
......
...@@ -179,6 +179,9 @@ DEFTREECODE (OVERLOAD, "overload", 'x', 1) ...@@ -179,6 +179,9 @@ DEFTREECODE (OVERLOAD, "overload", 'x', 1)
tree structure. */ tree structure. */
DEFTREECODE (WRAPPER, "wrapper", 'x', 1) 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 /* A whole bunch of tree codes for the initial, superficial parsing of
templates. */ templates. */
DEFTREECODE (LOOKUP_EXPR, "lookup_expr", 'e', 2) DEFTREECODE (LOOKUP_EXPR, "lookup_expr", 'e', 2)
......
...@@ -166,6 +166,15 @@ struct tree_wrapper ...@@ -166,6 +166,15 @@ struct tree_wrapper
} u; } 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 /* To identify to the debug emitters if it should pay attention to the
flag `-Wtemplate-debugging'. */ flag `-Wtemplate-debugging'. */
#define HAVE_TEMPLATES 1 #define HAVE_TEMPLATES 1
...@@ -2823,6 +2832,8 @@ extern tree make_temp_vec PROTO((int)); ...@@ -2823,6 +2832,8 @@ extern tree make_temp_vec PROTO((int));
extern tree build_ptr_wrapper PROTO((void *)); extern tree build_ptr_wrapper PROTO((void *));
extern tree build_expr_ptr_wrapper PROTO((void *)); extern tree build_expr_ptr_wrapper PROTO((void *));
extern tree build_int_wrapper PROTO((int)); 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 varargs_function_p PROTO((tree));
extern int really_overloaded_fn PROTO((tree)); extern int really_overloaded_fn PROTO((tree));
extern int cp_tree_equal PROTO((tree, tree)); extern int cp_tree_equal PROTO((tree, tree));
......
...@@ -3086,7 +3086,12 @@ finish_file () ...@@ -3086,7 +3086,12 @@ finish_file ()
for (fnname = pending_templates; fnname; fnname = TREE_CHAIN (fnname)) for (fnname = pending_templates; fnname; fnname = TREE_CHAIN (fnname))
{ {
tree srcloc = TREE_PURPOSE (fnname);
tree decl = TREE_VALUE (fnname); tree decl = TREE_VALUE (fnname);
input_filename = SRCLOC_FILE (srcloc);
lineno = SRCLOC_LINE (srcloc);
if (TREE_CODE_CLASS (TREE_CODE (decl)) == 't') if (TREE_CODE_CLASS (TREE_CODE (decl)) == 't')
{ {
instantiate_class_template (decl); instantiate_class_template (decl);
......
...@@ -2775,7 +2775,7 @@ add_pending_template (d) ...@@ -2775,7 +2775,7 @@ add_pending_template (d)
return; return;
*template_tail = perm_tree_cons *template_tail = perm_tree_cons
(current_function_decl, d, NULL_TREE); (build_srcloc_here (), d, NULL_TREE);
template_tail = &TREE_CHAIN (*template_tail); template_tail = &TREE_CHAIN (*template_tail);
TI_PENDING_TEMPLATE_FLAG (ti) = 1; TI_PENDING_TEMPLATE_FLAG (ti) = 1;
} }
...@@ -3346,8 +3346,8 @@ print_template_context (err) ...@@ -3346,8 +3346,8 @@ print_template_context (err)
if (current_function_decl == p->decl) if (current_function_decl == p->decl)
/* Avoid redundancy with the the "In function" line. */; /* Avoid redundancy with the the "In function" line. */;
else if (current_function_decl == NULL_TREE) else if (current_function_decl == NULL_TREE)
fprintf (stderr, "In instantiation of `%s':\n", fprintf (stderr, "%s: In instantiation of `%s':\n",
decl_as_string (p->decl, 0)); file, decl_as_string (p->decl, 0));
else else
my_friendly_abort (980521); my_friendly_abort (980521);
...@@ -3397,6 +3397,7 @@ push_tinst_level (d) ...@@ -3397,6 +3397,7 @@ push_tinst_level (d)
if (uses_template_parms (d)) if (uses_template_parms (d))
return 0; return 0;
last_template_error_tick = tinst_level_tick;
error ("template instantiation depth exceeds maximum of %d", error ("template instantiation depth exceeds maximum of %d",
max_tinst_depth); max_tinst_depth);
error (" (use -ftemplate-depth-NN to increase the maximum)"); error (" (use -ftemplate-depth-NN to increase the maximum)");
...@@ -7127,6 +7128,9 @@ instantiate_decl (d) ...@@ -7127,6 +7128,9 @@ instantiate_decl (d)
|| (! (TREE_CODE (d) == FUNCTION_DECL && DECL_INLINE (d) && nested) || (! (TREE_CODE (d) == FUNCTION_DECL && DECL_INLINE (d) && nested)
&& ! at_eof)) && ! at_eof))
{ {
lineno = line;
input_filename = file;
add_pending_template (d); add_pending_template (d);
goto out; goto out;
} }
......
...@@ -2267,6 +2267,23 @@ build_int_wrapper (i) ...@@ -2267,6 +2267,23 @@ build_int_wrapper (i)
return t; 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 void
push_expression_obstack () push_expression_obstack ()
{ {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment