From eded2736705e1a68bf83d334d8f1ccea25afd290 Mon Sep 17 00:00:00 2001 From: Paolo Carlini Date: Mon, 19 Dec 2011 22:40:11 +0000 Subject: [PATCH] re PR c++/51328 (ICE on invalid template parameter) /cp 2011-12-19 Paolo Carlini 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 PR c++/51328 * g++.dg/template/crash109.C: New. From-SVN: r182508 --- gcc/cp/ChangeLog | 6 ++++++ gcc/cp/pt.c | 12 ++++++++++-- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/template/crash109.C | 6 ++++++ 4 files changed, 27 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/g++.dg/template/crash109.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 3da96feb02b..8626e004cca 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2011-12-19 Paolo Carlini + + 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 PR c++/51530 diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 769b610cc47..820b1ff7552 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 %", 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 %", 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 7b349c922c5..e520613f0fc 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2011-12-19 Paolo Carlini + + PR c++/51328 + * g++.dg/template/crash109.C: New. + 2011-12-19 Jason Merrill 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 00000000000..28d9198b2b1 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash109.C @@ -0,0 +1,6 @@ +// PR c++/51328 + +template struct A +{ + void foo(A); // { dg-error "invalid use of destructor" } +};