From dffa4176aec81e6b81d355d99732be709d3bc8fe Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Wed, 3 Apr 2002 18:43:35 -0500 Subject: [PATCH] re PR c++/5104 (template using std::set_terminate fails due to throw() qualifier in ) PR c++/5104 * typeck.c (comptypes) [FUNCTION_TYPE]: Don't compare exception specifiers. [METHOD_TYPE]: Use same code as FUNCTION_TYPE. From-SVN: r51821 --- gcc/cp/ChangeLog | 7 +++++++ gcc/cp/typeck.c | 23 +++-------------------- gcc/testsuite/g++.dg/eh/spec4.C | 17 +++++++++++++++++ 3 files changed, 27 insertions(+), 20 deletions(-) create mode 100644 gcc/testsuite/g++.dg/eh/spec4.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 50dfde8..15e12d6 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,10 @@ +2002-04-04 Jason Merrill + + PR c++/5104 + * typeck.c (comptypes) [FUNCTION_TYPE]: Don't compare exception + specifiers. + [METHOD_TYPE]: Use same code as FUNCTION_TYPE. + 2002-04-03 Richard Henderson * cp-lang.c (cxx_warn_unused_global_decl): New. diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c index d379809..7596d29 100644 --- a/gcc/cp/typeck.c +++ b/gcc/cp/typeck.c @@ -763,7 +763,7 @@ comp_except_types (a, b, exact) } /* Return 1 if TYPE1 and TYPE2 are equivalent exception specifiers. - If EXACT is 0, T2 can be a subset of T1 (according to 15.4/7), + If EXACT is 0, T2 can be stricter than T1 (according to 15.4/7), otherwise it must be exact. Exception lists are unordered, but we've already filtered out duplicates. Most lists will be in order, we should try to make use of that. */ @@ -786,7 +786,7 @@ comp_except_specs (t1, t2, exact) return t2 != NULL_TREE && !TREE_VALUE (t2); if (t2 == NULL_TREE) /* T2 is ... */ return 0; - if (TREE_VALUE(t1) && !TREE_VALUE (t2)) /* T2 is EMPTY, T1 is not */ + if (TREE_VALUE (t1) && !TREE_VALUE (t2)) /* T2 is EMPTY, T1 is not */ return !exact; /* Neither set is ... or EMPTY, make sure each part of T2 is in T1. @@ -987,20 +987,6 @@ comptypes (t1, t2, strict) && comptypes (TREE_TYPE (t1), TREE_TYPE (t2), strict)); break; - case METHOD_TYPE: - if (! comp_except_specs (TYPE_RAISES_EXCEPTIONS (t1), - TYPE_RAISES_EXCEPTIONS (t2), 1)) - return 0; - - /* This case is anti-symmetrical! - One can pass a base member (or member function) - to something expecting a derived member (or member function), - but not vice-versa! */ - - val = (comptypes (TREE_TYPE (t1), TREE_TYPE (t2), strict) - && compparms (TYPE_ARG_TYPES (t1), TYPE_ARG_TYPES (t2))); - break; - case POINTER_TYPE: case REFERENCE_TYPE: t1 = TREE_TYPE (t1); @@ -1015,11 +1001,8 @@ comptypes (t1, t2, strict) goto look_hard; break; + case METHOD_TYPE: case FUNCTION_TYPE: - if (! comp_except_specs (TYPE_RAISES_EXCEPTIONS (t1), - TYPE_RAISES_EXCEPTIONS (t2), 1)) - return 0; - val = ((TREE_TYPE (t1) == TREE_TYPE (t2) || comptypes (TREE_TYPE (t1), TREE_TYPE (t2), strict)) && compparms (TYPE_ARG_TYPES (t1), TYPE_ARG_TYPES (t2))); diff --git a/gcc/testsuite/g++.dg/eh/spec4.C b/gcc/testsuite/g++.dg/eh/spec4.C new file mode 100644 index 0000000..a41605f --- /dev/null +++ b/gcc/testsuite/g++.dg/eh/spec4.C @@ -0,0 +1,17 @@ +// PR c++/5104 +// Test that a function with a throw spec is a valid template argument. + +#include + +typedef void (*HandlerFunction)(); +typedef HandlerFunction (*SetHandlerFunction)(HandlerFunction); + +template +class HandlerStack { +public: + static void defaultHandler(); +}; + +typedef HandlerStack Terminate; + +template<> void Terminate::defaultHandler() {}; -- 2.7.4