From 25aea4e9685c28d426f4c381802223841fa21f13 Mon Sep 17 00:00:00 2001 From: Dodji Seketeli <dodji@redhat.com> Date: Thu, 3 Feb 2011 19:55:00 +0000 Subject: [PATCH] re PR c++/47398 (tree check: accessed elt 10 of tree_vec with 9 elts in tsubst, at cp/pt.c:10500) Fix PR c++/47398 gcc/cp/ PR c++/47398 * tree.c (cp_tree_equal)<TEMPLATE_PARM_INDEX>: Take the number of template parameters in account. gcc/testsuite/ PR c++/47398 * g++.dg/template/typedef37.C: New test. * g++.dg/template/param1.C: Adjust expected error message. From-SVN: r169807 --- gcc/cp/ChangeLog | 6 +++ gcc/cp/tree.c | 3 ++ gcc/testsuite/ChangeLog | 6 +++ gcc/testsuite/g++.dg/template/param1.C | 4 +- gcc/testsuite/g++.dg/template/typedef37.C | 58 +++++++++++++++++++++++ 5 files changed, 75 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/g++.dg/template/typedef37.C 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 <dodji@redhat.com> + + PR c++/47398 + * tree.c (cp_tree_equal)<TEMPLATE_PARM_INDEX>: Take the number of + template parameters in account. + 2011-02-03 Nathan Froyd <froydnj@codesourcery.com> 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 <dodji@redhat.com> + + PR c++/47398 + * g++.dg/template/typedef37.C: New test. + * g++.dg/template/param1.C: Adjust expected error message. + 2011-02-03 Jakub Jelinek <jakub@redhat.com> 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 <reichelt@igpm.rwth-aachen.de> // { dg-do compile } -template<int> struct A +template<int> struct A // { dg-error "declaration" } { A(); }; -template<int N, char> A<N>::A() {} // { dg-error "got 2|but 1 required" } +template<int N, char> A<N>::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<int> +struct A +{ + typedef int INT; +}; + +template<int I> +struct transform +{ + static int bar(); +}; + +template<class T, int a, class U, int b> +struct B +{ + typedef typename A<a>::INT TINT; + void baz(); +}; + +template<class T, int a, class U> +struct B<T, a, U, 1> +{ + typedef typename A<a>::INT TINT; + void foo(); +}; + +template<class T, int a, class U, int b> +void +B<T, a, U, b>::baz() +{ + int c = transform<sizeof(TINT)>::bar();//#0 +} + +template<class T, int a, class U> +void +B<T, a, U, 1>::foo() +{ + int c = transform<sizeof(TINT)>::bar();//#1 +} + +int +main() +{ + B<int, 2, char, 1> i; + i.foo(); + // While instantiating + // + // template<class T, int a, class U> void B<T, a, U, 1>::foo() + // + // lookup_template_class resolves transform<sizeof(TINT)> in #1 to + // the wrong one; it picks up the one in #0 instead. This is because + // to compare the two A<a> comp_template_args uses cp_tree_equal + // that fails to consider the number of siblings of parm 'a'. +return 0; +} -- GitLab