diff options
author | Paolo Carlini <paolo.carlini@oracle.com> | 2011-03-03 17:07:28 +0000 |
---|---|---|
committer | Paolo Carlini <paolo@gcc.gnu.org> | 2011-03-03 17:07:28 +0000 |
commit | 5c62e6611d4b12f6fdf10743dd4d691d2d6d8962 (patch) | |
tree | ee43198a70116b3b2281c862b023d96214d4a63b /gcc | |
parent | ff4bfb1056a816c881c9ffb0314b2ff202b32d03 (diff) | |
download | gcc-5c62e6611d4b12f6fdf10743dd4d691d2d6d8962.zip gcc-5c62e6611d4b12f6fdf10743dd4d691d2d6d8962.tar.gz gcc-5c62e6611d4b12f6fdf10743dd4d691d2d6d8962.tar.bz2 |
re PR c++/47974 (ICE: tree check: expected tree_vec, have error_mark in tsubst_template_args, at cp/pt.c:8969 on invalid code)
/cp
2011-03-03 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/47974
* pt.c (tsubst_template_args): Check argument t for error_mark_node.
/testsuite
2011-03-03 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/47974
* g++.dg/template/crash106.C: New.
From-SVN: r170658
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/cp/pt.c | 11 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/template/crash106.C | 12 |
4 files changed, 30 insertions, 3 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index ef766fb..747457a 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2011-03-03 Paolo Carlini <paolo.carlini@oracle.com> + + PR c++/47974 + * pt.c (tsubst_template_args): Check argument t for error_mark_node. + 2011-03-03 Jason Merrill <jason@redhat.com> PR c++/47950 diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 60b2699..c52bb74 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -8966,9 +8966,14 @@ static tree tsubst_template_args (tree t, tree args, tsubst_flags_t complain, tree in_decl) { tree orig_t = t; - int len = TREE_VEC_LENGTH (t); - int need_new = 0, i, expanded_len_adjust = 0, out; - tree *elts = XALLOCAVEC (tree, len); + int len, need_new = 0, i, expanded_len_adjust = 0, out; + tree *elts; + + if (t == error_mark_node) + return error_mark_node; + + len = TREE_VEC_LENGTH (t); + elts = XALLOCAVEC (tree, len); for (i = 0; i < len; i++) { diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 3f7a372..69b7569 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2011-03-03 Paolo Carlini <paolo.carlini@oracle.com> + + PR c++/47974 + * g++.dg/template/crash106.C: New. + 2011-03-03 Jakub Jelinek <jakub@redhat.com> PR c/47963 diff --git a/gcc/testsuite/g++.dg/template/crash106.C b/gcc/testsuite/g++.dg/template/crash106.C new file mode 100644 index 0000000..c2d117e --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash106.C @@ -0,0 +1,12 @@ +// PR c++/47974 + +typedef double T; + +struct A +{ + template<T> void foo(); // { dg-error "type" } +}; + +template<T N = 0, void (A::*)() = &A::foo<N> > struct B {}; // { dg-error "type|declared" } + +B<> b; // { dg-error "type|declaration" } |