diff options
author | Dodji Seketeli <dodji@redhat.com> | 2011-02-03 19:55:00 +0000 |
---|---|---|
committer | Dodji Seketeli <dodji@gcc.gnu.org> | 2011-02-03 20:55:00 +0100 |
commit | 25aea4e9685c28d426f4c381802223841fa21f13 (patch) | |
tree | 8f6db14acbb7e0d99c9c54b93556ed9ed3b6ee44 /gcc | |
parent | 7fece97913380e58d310e5dcda45aec909eed696 (diff) | |
download | gcc-25aea4e9685c28d426f4c381802223841fa21f13.zip gcc-25aea4e9685c28d426f4c381802223841fa21f13.tar.gz gcc-25aea4e9685c28d426f4c381802223841fa21f13.tar.bz2 |
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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/tree.c | 3 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/template/param1.C | 4 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/template/typedef37.C | 58 |
5 files changed, 75 insertions, 2 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 65edb9c..6dd6137 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 1a1f150..d62d242 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 e32c521..d387efe 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 ad7fc8c..a8c3791 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 0000000..eefa383 --- /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; +} |