diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 65edb9c47a51..6dd6137ee5d1 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2011-02-03 Dodji Seketeli + + PR c++/47398 + * tree.c (cp_tree_equal): Take the number of + template parameters in account. + 2011-02-03 Nathan Froyd PR c++/46890 diff --git a/gcc/cp/tree.c b/gcc/cp/tree.c index 1a1f150e1cec..d62d2427f1e4 100644 --- a/gcc/cp/tree.c +++ b/gcc/cp/tree.c @@ -2176,6 +2176,9 @@ cp_tree_equal (tree t1, tree t2) BASELINK_FUNCTIONS (t2))); case TEMPLATE_PARM_INDEX: + if (TEMPLATE_PARM_NUM_SIBLINGS (t1) + != TEMPLATE_PARM_NUM_SIBLINGS (t2)) + return false; return (TEMPLATE_PARM_IDX (t1) == TEMPLATE_PARM_IDX (t2) && TEMPLATE_PARM_LEVEL (t1) == TEMPLATE_PARM_LEVEL (t2) && (TEMPLATE_PARM_PARAMETER_PACK (t1) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index e32c521dabe3..d387efe79803 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2011-02-03 Dodji Seketeli + + PR c++/47398 + * g++.dg/template/typedef37.C: New test. + * g++.dg/template/param1.C: Adjust expected error message. + 2011-02-03 Jakub Jelinek PR middle-end/31490 diff --git a/gcc/testsuite/g++.dg/template/param1.C b/gcc/testsuite/g++.dg/template/param1.C index ad7fc8cde0e1..a8c3791254fd 100644 --- a/gcc/testsuite/g++.dg/template/param1.C +++ b/gcc/testsuite/g++.dg/template/param1.C @@ -2,11 +2,11 @@ // Origin: Volker Reichelt // { dg-do compile } -template struct A +template struct A // { dg-error "declaration" } { A(); }; -template A::A() {} // { dg-error "got 2|but 1 required" } +template A::A() {} // { dg-error "invalid use of incomplete type" } A<0> a; diff --git a/gcc/testsuite/g++.dg/template/typedef37.C b/gcc/testsuite/g++.dg/template/typedef37.C new file mode 100644 index 000000000000..eefa38316ca6 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/typedef37.C @@ -0,0 +1,58 @@ +// Origin: PR c++/47398 +// { dg-do compile } + +template +struct A +{ + typedef int INT; +}; + +template +struct transform +{ + static int bar(); +}; + +template +struct B +{ + typedef typename A::INT TINT; + void baz(); +}; + +template +struct B +{ + typedef typename A::INT TINT; + void foo(); +}; + +template +void +B::baz() +{ + int c = transform::bar();//#0 +} + +template +void +B::foo() +{ + int c = transform::bar();//#1 +} + +int +main() +{ + B i; + i.foo(); + // While instantiating + // + // template void B::foo() + // + // lookup_template_class resolves transform in #1 to + // the wrong one; it picks up the one in #0 instead. This is because + // to compare the two A comp_template_args uses cp_tree_equal + // that fails to consider the number of siblings of parm 'a'. +return 0; +}