diff options
author | Mark Mitchell <mark@codesourcery.com> | 2006-08-02 20:35:41 +0000 |
---|---|---|
committer | Mark Mitchell <mmitchel@gcc.gnu.org> | 2006-08-02 20:35:41 +0000 |
commit | 6f67f0002265ca7da4eaf7a4065031658e9c1495 (patch) | |
tree | c28fb1643c0e1a9c9a02e7b33be1f25e44a31cb2 | |
parent | 006d133dfe0b0bedae5a3b471abbb6b3bdeed8e6 (diff) | |
download | gcc-6f67f0002265ca7da4eaf7a4065031658e9c1495.zip gcc-6f67f0002265ca7da4eaf7a4065031658e9c1495.tar.gz gcc-6f67f0002265ca7da4eaf7a4065031658e9c1495.tar.bz2 |
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
-rw-r--r-- | gcc/cp/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/cp/pt.c | 5 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/template/conv9.C | 16 |
4 files changed, 31 insertions, 0 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 1e327c2..9feacb4 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -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 diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 30e6cd0..c0205a4 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 8aa4e1a..4df1b9a 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -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 diff --git a/gcc/testsuite/g++.dg/template/conv9.C b/gcc/testsuite/g++.dg/template/conv9.C new file mode 100644 index 0000000..269e338 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/conv9.C @@ -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>(); +} |