diff options
author | Paolo Carlini <paolo.carlini@oracle.com> | 2011-12-19 22:40:11 +0000 |
---|---|---|
committer | Paolo Carlini <paolo@gcc.gnu.org> | 2011-12-19 22:40:11 +0000 |
commit | eded2736705e1a68bf83d334d8f1ccea25afd290 (patch) | |
tree | 0f16e5ed7eadd44a2868de9710634d63868efc31 | |
parent | 77a748f8879210e7c9758fca1d9beb4b1aaff691 (diff) | |
download | gcc-eded2736705e1a68bf83d334d8f1ccea25afd290.zip gcc-eded2736705e1a68bf83d334d8f1ccea25afd290.tar.gz gcc-eded2736705e1a68bf83d334d8f1ccea25afd290.tar.bz2 |
re PR c++/51328 (ICE on invalid template parameter)
/cp
2011-12-19 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/51328
* pt.c (convert_template_argument): Early error out and return
error_mark_node for invalid uses of destructors as types.
/testsuite
2011-12-19 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/51328
* g++.dg/template/crash109.C: New.
From-SVN: r182508
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/pt.c | 12 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/template/crash109.C | 6 |
4 files changed, 27 insertions, 2 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 3da96fe..8626e00 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2011-12-19 Paolo Carlini <paolo.carlini@oracle.com> + + PR c++/51328 + * pt.c (convert_template_argument): Early error out and return + error_mark_node for invalid uses of destructors as types. + 2011-12-19 Jason Merrill <jason@redhat.com> PR c++/51530 diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 769b610..820b1ff 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -6445,8 +6445,16 @@ convert_template_argument (tree parm, if (requires_type && ! is_type && TREE_CODE (arg) == SCOPE_REF && TREE_CODE (TREE_OPERAND (arg, 0)) == TEMPLATE_TYPE_PARM) { - permerror (input_location, "to refer to a type member of a template parameter, " - "use %<typename %E%>", orig_arg); + if (TREE_CODE (TREE_OPERAND (arg, 1)) == BIT_NOT_EXPR) + { + if (complain & tf_error) + error ("invalid use of destructor %qE as a type", orig_arg); + return error_mark_node; + } + + permerror (input_location, + "to refer to a type member of a template parameter, " + "use %<typename %E%>", orig_arg); orig_arg = make_typename_type (TREE_OPERAND (arg, 0), TREE_OPERAND (arg, 1), diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 7b349c9..e520613 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2011-12-19 Paolo Carlini <paolo.carlini@oracle.com> + + PR c++/51328 + * g++.dg/template/crash109.C: New. + 2011-12-19 Jason Merrill <jason@redhat.com> PR c++/51530 diff --git a/gcc/testsuite/g++.dg/template/crash109.C b/gcc/testsuite/g++.dg/template/crash109.C new file mode 100644 index 0000000..28d9198 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash109.C @@ -0,0 +1,6 @@ +// PR c++/51328 + +template<typename T> struct A +{ + void foo(A<T::~T>); // { dg-error "invalid use of destructor" } +}; |