Commit dffa4176 by Jason Merrill Committed by Jason Merrill

re PR c++/5104 (template using std::set_terminate fails due to throw() qualifier in <exception>)

        PR c++/5104
        * typeck.c (comptypes) [FUNCTION_TYPE]: Don't compare exception
        specifiers.
        [METHOD_TYPE]: Use same code as FUNCTION_TYPE.

From-SVN: r51821
parent 36c2272c
2002-04-04 Jason Merrill <jason@redhat.com>
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 <rth@redhat.com> 2002-04-03 Richard Henderson <rth@redhat.com>
* cp-lang.c (cxx_warn_unused_global_decl): New. * cp-lang.c (cxx_warn_unused_global_decl): New.
......
...@@ -763,7 +763,7 @@ comp_except_types (a, b, exact) ...@@ -763,7 +763,7 @@ comp_except_types (a, b, exact)
} }
/* Return 1 if TYPE1 and TYPE2 are equivalent exception specifiers. /* 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 otherwise it must be exact. Exception lists are unordered, but
we've already filtered out duplicates. Most lists will be in order, we've already filtered out duplicates. Most lists will be in order,
we should try to make use of that. */ we should try to make use of that. */
...@@ -786,7 +786,7 @@ comp_except_specs (t1, t2, exact) ...@@ -786,7 +786,7 @@ comp_except_specs (t1, t2, exact)
return t2 != NULL_TREE && !TREE_VALUE (t2); return t2 != NULL_TREE && !TREE_VALUE (t2);
if (t2 == NULL_TREE) /* T2 is ... */ if (t2 == NULL_TREE) /* T2 is ... */
return 0; 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; return !exact;
/* Neither set is ... or EMPTY, make sure each part of T2 is in T1. /* Neither set is ... or EMPTY, make sure each part of T2 is in T1.
...@@ -987,20 +987,6 @@ comptypes (t1, t2, strict) ...@@ -987,20 +987,6 @@ comptypes (t1, t2, strict)
&& comptypes (TREE_TYPE (t1), TREE_TYPE (t2), strict)); && comptypes (TREE_TYPE (t1), TREE_TYPE (t2), strict));
break; 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 POINTER_TYPE:
case REFERENCE_TYPE: case REFERENCE_TYPE:
t1 = TREE_TYPE (t1); t1 = TREE_TYPE (t1);
...@@ -1015,11 +1001,8 @@ comptypes (t1, t2, strict) ...@@ -1015,11 +1001,8 @@ comptypes (t1, t2, strict)
goto look_hard; goto look_hard;
break; break;
case METHOD_TYPE:
case FUNCTION_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) val = ((TREE_TYPE (t1) == TREE_TYPE (t2)
|| comptypes (TREE_TYPE (t1), TREE_TYPE (t2), strict)) || comptypes (TREE_TYPE (t1), TREE_TYPE (t2), strict))
&& compparms (TYPE_ARG_TYPES (t1), TYPE_ARG_TYPES (t2))); && compparms (TYPE_ARG_TYPES (t1), TYPE_ARG_TYPES (t2)));
......
// PR c++/5104
// Test that a function with a throw spec is a valid template argument.
#include <exception>
typedef void (*HandlerFunction)();
typedef HandlerFunction (*SetHandlerFunction)(HandlerFunction);
template <SetHandlerFunction set_function>
class HandlerStack {
public:
static void defaultHandler();
};
typedef HandlerStack<std::set_terminate> Terminate;
template<> void Terminate::defaultHandler() {};
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment