From ba7d31f68a4afe75450273f8e941259b1c676982 Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Sat, 12 Mar 2011 01:48:57 -0500 Subject: [PATCH] re PR c++/47125 (ICE occurs in combination with partial specialization and invalid template function.) PR c++/47125 * pt.c (tsubst) [TYPENAME_TYPE]: Only give errors if tf_error. From-SVN: r170896 --- gcc/cp/ChangeLog | 3 +++ gcc/cp/pt.c | 18 ++++++++++++++---- gcc/testsuite/ChangeLog | 2 ++ gcc/testsuite/g++.dg/template/error45.C | 22 ++++++++++++++++++++++ 4 files changed, 41 insertions(+), 4 deletions(-) create mode 100644 gcc/testsuite/g++.dg/template/error45.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 64281fd684e..7c1e739ad70 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,8 @@ 2011-03-11 Jason Merrill + PR c++/47125 + * pt.c (tsubst) [TYPENAME_TYPE]: Only give errors if tf_error. + PR c++/47144 * parser.c (cp_parser_template_type_arg): Set type_definition_forbidden_message. diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index ab2aea3b536..95b82ee579d 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -10948,11 +10948,21 @@ tsubst (tree t, tree args, tsubst_flags_t complain, tree in_decl) if (TREE_CODE (f) != TYPENAME_TYPE) { if (TYPENAME_IS_ENUM_P (t) && TREE_CODE (f) != ENUMERAL_TYPE) - error ("%qT resolves to %qT, which is not an enumeration type", - t, f); + { + if (complain & tf_error) + error ("%qT resolves to %qT, which is not an enumeration type", + t, f); + else + return error_mark_node; + } else if (TYPENAME_IS_CLASS_P (t) && !CLASS_TYPE_P (f)) - error ("%qT resolves to %qT, which is is not a class type", - t, f); + { + if (complain & tf_error) + error ("%qT resolves to %qT, which is is not a class type", + t, f); + else + return error_mark_node; + } } return cp_build_qualified_type_real diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 5ee1fcd9335..9652b4aae30 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,7 @@ 2011-03-11 Jason Merrill + * g++.dg/template/error45.C: New. + * g++.dg/parse/no-type-defn1.C: New. * g++.dg/ext/attrib40.C: New. diff --git a/gcc/testsuite/g++.dg/template/error45.C b/gcc/testsuite/g++.dg/template/error45.C new file mode 100644 index 00000000000..454acc63149 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/error45.C @@ -0,0 +1,22 @@ +// PR c++/47125 + +template < bool, typename > +struct enable_if {}; + +template < typename T > +struct enable_if< true, T > +{ + typedef T type; +}; + +template < typename T > +struct enable_if< true, T >::type +f( T x ); + +void +g( void ) +{ + f< int >( 0 ); // { dg-error "no match" } +} + +// { dg-prune-output "note" } -- 2.30.2