diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 023f4571f90..341db452630 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,15 @@ +1998-05-23 Jason Merrill + + * 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 * decl.c (lang_print_error_function): New fn. diff --git a/gcc/cp/cp-tree.def b/gcc/cp/cp-tree.def index 2124a04e693..cad0a591420 100644 --- a/gcc/cp/cp-tree.def +++ b/gcc/cp/cp-tree.def @@ -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) diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h index 3cde1028f53..f12a82eb253 100644 --- a/gcc/cp/cp-tree.h +++ b/gcc/cp/cp-tree.h @@ -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)); diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c index 31903411922..2ad9bbe5f22 100644 --- a/gcc/cp/decl2.c +++ b/gcc/cp/decl2.c @@ -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); diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 920e0622fa7..d148e0dd93a 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -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; } diff --git a/gcc/cp/tree.c b/gcc/cp/tree.c index 60d20b3f258..ce601184d23 100644 --- a/gcc/cp/tree.c +++ b/gcc/cp/tree.c @@ -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 () {