Commit 798eed5e by Jason Merrill Committed by Jason Merrill

* call.c (standard_conversion): Fix multi-level ptr conversions.

From-SVN: r17999
parent d757d141
Fri Feb 13 14:30:35 1998 Jason Merrill <jason@yorick.cygnus.com> Fri Feb 13 14:55:37 1998 Jason Merrill <jason@yorick.cygnus.com>
* pt.c (determine_specialization): Give better errors. * call.c (standard_conversion): Fix multi-level ptr conversions.
Fri Feb 13 14:06:22 1998 Mike Stump <mrs@wrs.com> Fri Feb 13 14:06:22 1998 Mike Stump <mrs@wrs.com>
......
...@@ -3107,19 +3107,15 @@ standard_conversion (to, from, expr) ...@@ -3107,19 +3107,15 @@ standard_conversion (to, from, expr)
{ {
enum tree_code ufcode = TREE_CODE (TREE_TYPE (from)); enum tree_code ufcode = TREE_CODE (TREE_TYPE (from));
enum tree_code utcode = TREE_CODE (TREE_TYPE (to)); enum tree_code utcode = TREE_CODE (TREE_TYPE (to));
tree nconv = NULL_TREE;
if (comptypes (TYPE_MAIN_VARIANT (TREE_TYPE (from)), if (utcode == VOID_TYPE && ufcode != OFFSET_TYPE
TYPE_MAIN_VARIANT (TREE_TYPE (to)), 1)) && ufcode != FUNCTION_TYPE)
nconv = conv;
else if (utcode == VOID_TYPE && ufcode != OFFSET_TYPE
&& ufcode != FUNCTION_TYPE)
{ {
from = build_pointer_type from = build_pointer_type
(cp_build_type_variant (void_type_node, (cp_build_type_variant (void_type_node,
TYPE_READONLY (TREE_TYPE (from)), TYPE_READONLY (TREE_TYPE (from)),
TYPE_VOLATILE (TREE_TYPE (from)))); TYPE_VOLATILE (TREE_TYPE (from))));
nconv = build_conv (PTR_CONV, from, conv); conv = build_conv (PTR_CONV, from, conv);
} }
else if (ufcode == OFFSET_TYPE && utcode == OFFSET_TYPE) else if (ufcode == OFFSET_TYPE && utcode == OFFSET_TYPE)
{ {
...@@ -3133,7 +3129,7 @@ standard_conversion (to, from, expr) ...@@ -3133,7 +3129,7 @@ standard_conversion (to, from, expr)
{ {
from = build_offset_type (tbase, TREE_TYPE (TREE_TYPE (from))); from = build_offset_type (tbase, TREE_TYPE (TREE_TYPE (from)));
from = build_pointer_type (from); from = build_pointer_type (from);
nconv = build_conv (PMEM_CONV, from, conv); conv = build_conv (PMEM_CONV, from, conv);
} }
} }
else if (IS_AGGR_TYPE (TREE_TYPE (from)) else if (IS_AGGR_TYPE (TREE_TYPE (from))
...@@ -3145,14 +3141,14 @@ standard_conversion (to, from, expr) ...@@ -3145,14 +3141,14 @@ standard_conversion (to, from, expr)
TYPE_READONLY (TREE_TYPE (from)), TYPE_READONLY (TREE_TYPE (from)),
TYPE_VOLATILE (TREE_TYPE (from))); TYPE_VOLATILE (TREE_TYPE (from)));
from = build_pointer_type (from); from = build_pointer_type (from);
nconv = build_conv (PTR_CONV, from, conv); conv = build_conv (PTR_CONV, from, conv);
} }
} }
if (nconv && comptypes (from, to, 1)) if (comptypes (from, to, 1))
conv = nconv; /* OK */;
else if (nconv && comp_ptr_ttypes (TREE_TYPE (to), TREE_TYPE (from))) else if (comp_ptr_ttypes (TREE_TYPE (to), TREE_TYPE (from)))
conv = build_conv (QUAL_CONV, to, nconv); conv = build_conv (QUAL_CONV, to, conv);
else if (ptr_reasonably_similar (TREE_TYPE (to), TREE_TYPE (from))) else if (ptr_reasonably_similar (TREE_TYPE (to), TREE_TYPE (from)))
{ {
conv = build_conv (PTR_CONV, to, conv); conv = build_conv (PTR_CONV, to, conv);
......
...@@ -519,15 +519,7 @@ determine_specialization (template_id, decl, targs_out, ...@@ -519,15 +519,7 @@ determine_specialization (template_id, decl, targs_out,
tmpl = DECL_TI_TEMPLATE (fn); tmpl = DECL_TI_TEMPLATE (fn);
else if (TREE_CODE (fn) != TEMPLATE_DECL else if (TREE_CODE (fn) != TEMPLATE_DECL
|| (need_member_template && !is_member_template (fn))) || (need_member_template && !is_member_template (fn)))
{ continue;
if (decls_match (decl, fn) && 0)
{
cp_error ("`template <>' applied to non-specialization `%D'",
fn);
return NULL_TREE;
}
continue;
}
else else
tmpl = fn; tmpl = fn;
...@@ -572,7 +564,8 @@ determine_specialization (template_id, decl, targs_out, ...@@ -572,7 +564,8 @@ determine_specialization (template_id, decl, targs_out,
{ {
no_match: no_match:
if (complain) if (complain)
cp_error ("`%D' does not match any template declaration", decl); cp_error ("`%D' does not match any template declaration",
template_id);
return NULL_TREE; return NULL_TREE;
} }
...@@ -581,7 +574,8 @@ determine_specialization (template_id, decl, targs_out, ...@@ -581,7 +574,8 @@ determine_specialization (template_id, decl, targs_out,
ambiguous: ambiguous:
if (complain) if (complain)
{ {
cp_error ("ambiguous template specialization `%D'", decl); cp_error ("ambiguous template specialization `%D'",
template_id);
print_candidates (templates); print_candidates (templates);
} }
return NULL_TREE; return NULL_TREE;
......
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