re PR c++/28557 (Trouble with templated type conversion operator)

PR c++/28557
	* pt.c (tsubst_baselink): Substitute into BASELINK_OPTYPE.
	PR c++/28557
	* g++.dg/template/conv9.C: New test.

From-SVN: r115886
This commit is contained in:
Mark Mitchell 2006-08-02 20:35:41 +00:00 committed by Mark Mitchell
parent 006d133dfe
commit 6f67f00022
4 changed files with 31 additions and 0 deletions

View file

@ -1,3 +1,8 @@
2006-08-02 Mark Mitchell <mark@codesourcery.com>
PR c++/28557
* pt.c (tsubst_baselink): Substitute into BASELINK_OPTYPE.
2006-07-31 Mark Mitchell <mark@codesourcery.com>
PR c++/28523

View file

@ -7675,6 +7675,7 @@ tsubst_baselink (tree baselink, tree object_type,
tree name;
tree qualifying_scope;
tree fns;
tree optype;
tree template_args = 0;
bool template_id_p = false;
@ -7688,6 +7689,7 @@ tsubst_baselink (tree baselink, tree object_type,
ambiguous now. Therefore, we perform the lookup again. */
qualifying_scope = BINFO_TYPE (BASELINK_ACCESS_BINFO (baselink));
fns = BASELINK_FUNCTIONS (baselink);
optype = BASELINK_OPTYPE (baselink);
if (TREE_CODE (fns) == TEMPLATE_ID_EXPR)
{
template_id_p = true;
@ -7715,6 +7717,9 @@ tsubst_baselink (tree baselink, tree object_type,
= build_nt (TEMPLATE_ID_EXPR,
BASELINK_FUNCTIONS (baselink),
template_args);
/* Update the conversion operator type. */
BASELINK_OPTYPE (baselink)
= tsubst (optype, args, complain, in_decl);
if (!object_type)
object_type = current_class_type;

View file

@ -1,3 +1,8 @@
2006-08-02 Mark Mitchell <mark@codesourcery.com>
PR c++/28557
* g++.dg/template/conv9.C: New test.
2006-08-02 Daniel Jacobowitz <dan@codesourcery.com>
PR debug/28063

View file

@ -0,0 +1,16 @@
// PR c++/28557
struct A
{
template<typename T> operator T() { return T(); }
};
template<int> void foo()
{
A().operator int();
}
void bar()
{
foo<0>();
}