From 6f67f0002265ca7da4eaf7a4065031658e9c1495 Mon Sep 17 00:00:00 2001 From: Mark Mitchell Date: Wed, 2 Aug 2006 20:35:41 +0000 Subject: [PATCH] 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 --- gcc/cp/ChangeLog | 5 +++++ gcc/cp/pt.c | 5 +++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/template/conv9.C | 16 ++++++++++++++++ 4 files changed, 31 insertions(+) create mode 100644 gcc/testsuite/g++.dg/template/conv9.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 1e327c22e76e..9feacb451bc9 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2006-08-02 Mark Mitchell + + PR c++/28557 + * pt.c (tsubst_baselink): Substitute into BASELINK_OPTYPE. + 2006-07-31 Mark Mitchell PR c++/28523 diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 30e6cd09a4b3..c0205a419c7c 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -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; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 8aa4e1a1778a..4df1b9a5945c 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2006-08-02 Mark Mitchell + + PR c++/28557 + * g++.dg/template/conv9.C: New test. + 2006-08-02 Daniel Jacobowitz PR debug/28063 diff --git a/gcc/testsuite/g++.dg/template/conv9.C b/gcc/testsuite/g++.dg/template/conv9.C new file mode 100644 index 000000000000..269e338a36cc --- /dev/null +++ b/gcc/testsuite/g++.dg/template/conv9.C @@ -0,0 +1,16 @@ +// PR c++/28557 + +struct A +{ + template operator T() { return T(); } +}; + +template void foo() +{ + A().operator int(); +} + +void bar() +{ + foo<0>(); +} -- 2.43.5