From: Jason Merrill Date: Tue, 22 Dec 2009 23:16:46 +0000 (-0500) Subject: re PR c++/42466 (Multiple instantiations of template constructor fail) X-Git-Tag: releases/gcc-4.5.0~1544 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=2865105751562a5546c12040c0a7ba0fd58e639f;p=thirdparty%2Fgcc.git re PR c++/42466 (Multiple instantiations of template constructor fail) PR c++/42466 * pt.c (reduce_template_parm_level): Check the type before returning cached TEMPLATE_PARM_INDEX. From-SVN: r155411 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index b75e38ac22d6..65d40e231e58 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,9 @@ 2009-12-22 Jason Merrill + PR c++/42466 + * pt.c (reduce_template_parm_level): Check the type before + returning cached TEMPLATE_PARM_INDEX. + PR c++/42331 * typeck.c (cp_build_modify_expr): Fix thinko. diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index bb7c167ebe04..85ad539f4192 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -3356,7 +3356,8 @@ reduce_template_parm_level (tree index, tree type, int levels, tree args, { if (TEMPLATE_PARM_DESCENDANTS (index) == NULL_TREE || (TEMPLATE_PARM_LEVEL (TEMPLATE_PARM_DESCENDANTS (index)) - != TEMPLATE_PARM_LEVEL (index) - levels)) + != TEMPLATE_PARM_LEVEL (index) - levels) + || !same_type_p (type, TREE_TYPE (TEMPLATE_PARM_DESCENDANTS (index)))) { tree orig_decl = TEMPLATE_PARM_DECL (index); tree decl, t; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index cfd4b5ecf1e7..59d3a09be2f3 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,8 @@ 2009-12-22 Jason Merrill + PR c++/42466 + * g++.dg/template/nontype19.C: New. + PR c++/42331 * g++.dg/cpp0x/initlist29.C: New. diff --git a/gcc/testsuite/g++.dg/template/nontype19.C b/gcc/testsuite/g++.dg/template/nontype19.C new file mode 100644 index 000000000000..1df78b3b3806 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/nontype19.C @@ -0,0 +1,19 @@ +// PR c++/42466 + +template +struct A +{ + A(); + + template + A(const A& other); +}; + +int main(int argc, char** argv) +{ + A a; + A b = a; + + A c; + A d = c; +}