Commit 247078ec by Jason Merrill Committed by Jason Merrill

typeck2.c (merge_exception_specifiers): Adjust merging of throw() and noexcept(true).

	* typeck2.c (merge_exception_specifiers): Adjust merging of
	throw() and noexcept(true).

From-SVN: r160308
parent 4af89b88
2010-06-04 Jason Merrill <jason@redhat.com>
* typeck2.c (merge_exception_specifiers): Adjust merging of
throw() and noexcept(true).
* pt.c (value_dependent_expression_p) [NOEXCEPT_EXPR]: Avoid
using an uninitialized variable.
......
......@@ -1721,17 +1721,14 @@ merge_exception_specifiers (tree list, tree add)
{
if (!list || !add)
return NULL_TREE;
/* A noexcept(true) spec takes precedence over a throw() spec.
/* For merging noexcept(true) and throw(), take the more recent one (LIST).
A throw(type-list) spec takes precedence over a noexcept(false) spec.
Any other noexcept-spec should only be merged with an equivalent one.
So the !TREE_VALUE code is correct for the latter two cases. */
else if (list == noexcept_true_spec
|| add == noexcept_true_spec)
return noexcept_true_spec;
else if (!TREE_VALUE (list))
return add;
So the !TREE_VALUE code below is correct for all cases. */
else if (!TREE_VALUE (add))
return list;
else if (!TREE_VALUE (list))
return add;
else
{
tree orig_list = list;
......
2010-06-04 Jason Merrill <jason@redhat.com>
* g++.dg/cpp0x/noexcept06.C: New.
* g++.dg/cpp0x/noexcept07.C: New.
* g++.dg/cpp0x/noexcept01.C: New.
* g++.dg/cpp0x/noexcept02.C: New.
* g++.dg/cpp0x/noexcept03.C: New.
......
// Test that checking of a nothrow specification uses the one on the
// definition.
// { dg-options "-std=c++0x" }
// { dg-do run }
#include <exception>
#include <cstdlib>
void my_unexpected ()
{
std::abort ();
}
void my_terminate ()
{
std::exit (0);
}
void f() throw();
void f() noexcept
{
throw 1;
}
int main()
{
std::set_terminate (my_terminate);
f();
return 1;
}
// Test that checking of a nothrow specification uses the one on the
// definition.
// { dg-options "-std=c++0x" }
// { dg-do run }
#include <exception>
#include <cstdlib>
void my_unexpected ()
{
std::exit (0);
}
void f() noexcept;
void f() throw()
{
throw 1;
}
int main()
{
std::set_unexpected (my_unexpected);
f();
return 1;
}
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