pt.c (determine_specialization): Just return an error_mark_node.
* pt.c (determine_specialization): Just return an error_mark_node. Also print the decl we want in error messages. If we complain, return error_mark_node. (tsubst_friend_function): Set lineno and input_filename so error messages will be useful. (instantiate_template): Just return an error_mark_node. * pt.c (print_template_context): Add new argument. (maybe_print_template_context): New fn. (push_tinst_level): Increment tinst_level_tick. (pop_tinst_level): Likewise. * errfn.c (cp_thing): Call maybe_print_template_context. Use xrealloc instead of xmalloc. * typeck.c (build_unary_op, CONVERT_EXPR): Propagate TREE_CONSTANT. From-SVN: r19946
This commit is contained in:
parent
911c3b7d7c
commit
27fafc8de1
|
@ -1,3 +1,21 @@
|
|||
1998-05-22 Jason Merrill <jason@yorick.cygnus.com>
|
||||
|
||||
* pt.c (determine_specialization): Just return an error_mark_node.
|
||||
Also print the decl we want in error messages. If we complain,
|
||||
return error_mark_node.
|
||||
(tsubst_friend_function): Set lineno and input_filename so
|
||||
error messages will be useful.
|
||||
(instantiate_template): Just return an error_mark_node.
|
||||
|
||||
* pt.c (print_template_context): Add new argument.
|
||||
(maybe_print_template_context): New fn.
|
||||
(push_tinst_level): Increment tinst_level_tick.
|
||||
(pop_tinst_level): Likewise.
|
||||
* errfn.c (cp_thing): Call maybe_print_template_context. Use
|
||||
xrealloc instead of xmalloc.
|
||||
|
||||
* typeck.c (build_unary_op, CONVERT_EXPR): Propagate TREE_CONSTANT.
|
||||
|
||||
1998-05-21 Jason Merrill <jason@yorick.cygnus.com>
|
||||
|
||||
* pt.c (tsubst_friend_class): Don't call redeclare_class_template
|
||||
|
|
|
@ -72,11 +72,13 @@ cp_thing (errfn, atarg1, format, ap)
|
|||
const char *f;
|
||||
tree atarg = 0;
|
||||
|
||||
maybe_print_template_context ();
|
||||
|
||||
len = strlen (format) + 1;
|
||||
if (len > buflen)
|
||||
{
|
||||
buflen = len;
|
||||
buf = xmalloc (buflen);
|
||||
buf = xrealloc (buf, buflen);
|
||||
}
|
||||
offset = 0;
|
||||
|
||||
|
|
89
gcc/cp/pt.c
89
gcc/cp/pt.c
|
@ -756,6 +756,9 @@ determine_specialization (template_id, decl, targs_out,
|
|||
|
||||
*targs_out = NULL_TREE;
|
||||
|
||||
if (fns == error_mark_node)
|
||||
return error_mark_node;
|
||||
|
||||
/* Check for baselinks. */
|
||||
if (TREE_CODE (fns) == TREE_LIST)
|
||||
fns = TREE_VALUE (fns);
|
||||
|
@ -823,9 +826,11 @@ determine_specialization (template_id, decl, targs_out,
|
|||
{
|
||||
no_match:
|
||||
if (complain)
|
||||
cp_error ("`%D' does not match any template declaration",
|
||||
template_id);
|
||||
|
||||
{
|
||||
cp_error_at ("template-id `%D' for `%+D' does not match any template declaration",
|
||||
template_id, decl);
|
||||
return error_mark_node;
|
||||
}
|
||||
return NULL_TREE;
|
||||
}
|
||||
else if (TREE_CHAIN (templates) != NULL_TREE)
|
||||
|
@ -833,9 +838,10 @@ determine_specialization (template_id, decl, targs_out,
|
|||
ambiguous:
|
||||
if (complain)
|
||||
{
|
||||
cp_error ("ambiguous template specialization `%D'",
|
||||
template_id);
|
||||
cp_error_at ("ambiguous template specialization `%D' for `%+D'",
|
||||
template_id, decl);
|
||||
print_candidates (templates);
|
||||
return error_mark_node;
|
||||
}
|
||||
return NULL_TREE;
|
||||
}
|
||||
|
@ -3313,24 +3319,46 @@ uses_template_parms (t)
|
|||
return for_each_template_parm (t, 0, 0);
|
||||
}
|
||||
|
||||
static struct tinst_level *current_tinst_level = 0;
|
||||
static struct tinst_level *free_tinst_level = 0;
|
||||
static int tinst_depth = 0;
|
||||
static struct tinst_level *current_tinst_level;
|
||||
static struct tinst_level *free_tinst_level;
|
||||
static int tinst_depth;
|
||||
extern int max_tinst_depth;
|
||||
#ifdef GATHER_STATISTICS
|
||||
int depth_reached = 0;
|
||||
int depth_reached;
|
||||
#endif
|
||||
int tinst_level_tick;
|
||||
int last_template_error_tick;
|
||||
|
||||
/* Print out all the template instantiations that we are currently
|
||||
working on. */
|
||||
working on. If ERR, we are being called from cp_thing, so do
|
||||
the right thing for an error message. */
|
||||
|
||||
void
|
||||
print_template_context ()
|
||||
static void
|
||||
print_template_context (err)
|
||||
int err;
|
||||
{
|
||||
struct tinst_level *p = current_tinst_level;
|
||||
int line = lineno;
|
||||
char *file = input_filename;
|
||||
|
||||
if (err)
|
||||
{
|
||||
if (current_function_decl == p->decl)
|
||||
/* Avoid redundancy with the the "In function" line. */;
|
||||
else if (current_function_decl == NULL_TREE)
|
||||
cp_error ("In instantiation of `%D':", p->decl);
|
||||
else
|
||||
my_friendly_abort (980521);
|
||||
|
||||
if (p)
|
||||
{
|
||||
lineno = p->line;
|
||||
input_filename = p->file;
|
||||
p = p->next;
|
||||
}
|
||||
}
|
||||
|
||||
next:
|
||||
for (; p; p = p->next)
|
||||
{
|
||||
cp_error (" instantiated from `%D'", p->decl);
|
||||
|
@ -3343,6 +3371,19 @@ print_template_context ()
|
|||
input_filename = file;
|
||||
}
|
||||
|
||||
/* Called from cp_thing to print the template context for an error. */
|
||||
|
||||
void
|
||||
maybe_print_template_context ()
|
||||
{
|
||||
if (last_template_error_tick == tinst_level_tick
|
||||
|| current_tinst_level == 0)
|
||||
return;
|
||||
|
||||
last_template_error_tick = tinst_level_tick;
|
||||
print_template_context (1);
|
||||
}
|
||||
|
||||
static int
|
||||
push_tinst_level (d)
|
||||
tree d;
|
||||
|
@ -3362,7 +3403,7 @@ push_tinst_level (d)
|
|||
error (" (use -ftemplate-depth-NN to increase the maximum)");
|
||||
cp_error (" instantiating `%D'", d);
|
||||
|
||||
print_template_context ();
|
||||
print_template_context (0);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -3387,6 +3428,7 @@ push_tinst_level (d)
|
|||
depth_reached = tinst_depth;
|
||||
#endif
|
||||
|
||||
++tinst_level_tick;
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
@ -3399,6 +3441,7 @@ pop_tinst_level ()
|
|||
old->next = free_tinst_level;
|
||||
free_tinst_level = old;
|
||||
--tinst_depth;
|
||||
++tinst_level_tick;
|
||||
}
|
||||
|
||||
struct tinst_level *
|
||||
|
@ -3423,7 +3466,12 @@ tsubst_friend_function (decl, args)
|
|||
tree args;
|
||||
{
|
||||
tree new_friend;
|
||||
|
||||
int line = lineno;
|
||||
char *file = input_filename;
|
||||
|
||||
lineno = DECL_SOURCE_LINE (decl);
|
||||
input_filename = DECL_SOURCE_FILE (decl);
|
||||
|
||||
if (TREE_CODE (decl) == FUNCTION_DECL
|
||||
&& DECL_TEMPLATE_INSTANTIATION (decl)
|
||||
&& TREE_CODE (DECL_TI_TEMPLATE (decl)) != TEMPLATE_DECL)
|
||||
|
@ -3458,10 +3506,11 @@ tsubst_friend_function (decl, args)
|
|||
new_friend,
|
||||
&new_args,
|
||||
0, 1);
|
||||
return instantiate_template (tmpl, new_args);
|
||||
new_friend = instantiate_template (tmpl, new_args);
|
||||
goto done;
|
||||
}
|
||||
else
|
||||
new_friend = tsubst (decl, args, NULL_TREE);
|
||||
else
|
||||
new_friend = tsubst (decl, args, NULL_TREE);
|
||||
|
||||
/* The new_friend will look like an instantiation, to the
|
||||
compiler, but is not an instantiation from the point of view of
|
||||
|
@ -3497,6 +3546,9 @@ tsubst_friend_function (decl, args)
|
|||
new_friend = fn;
|
||||
}
|
||||
|
||||
done:
|
||||
lineno = line;
|
||||
input_filename = file;
|
||||
return new_friend;
|
||||
}
|
||||
|
||||
|
@ -5516,6 +5568,9 @@ instantiate_template (tmpl, targ_ptr)
|
|||
struct obstack *old_fmp_obstack;
|
||||
extern struct obstack *function_maybepermanent_obstack;
|
||||
|
||||
if (tmpl == error_mark_node)
|
||||
return error_mark_node;
|
||||
|
||||
my_friendly_assert (TREE_CODE (tmpl) == TEMPLATE_DECL, 283);
|
||||
|
||||
/* FIXME this won't work with member templates; we only have one level
|
||||
|
|
|
@ -4259,6 +4259,7 @@ build_unary_op (code, xarg, noconvert)
|
|||
if (!noconvert)
|
||||
arg = default_conversion (arg);
|
||||
arg = build1 (NON_LVALUE_EXPR, TREE_TYPE (arg), arg);
|
||||
TREE_CONSTANT (arg) = TREE_CONSTANT (TREE_OPERAND (arg, 0));
|
||||
}
|
||||
break;
|
||||
|
||||
|
|
Loading…
Reference in New Issue