mirror of git://gcc.gnu.org/git/gcc.git
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
This commit is contained in:
parent
4af89b884c
commit
247078ec4d
|
@ -1,5 +1,8 @@
|
||||||
2010-06-04 Jason Merrill <jason@redhat.com>
|
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
|
* pt.c (value_dependent_expression_p) [NOEXCEPT_EXPR]: Avoid
|
||||||
using an uninitialized variable.
|
using an uninitialized variable.
|
||||||
|
|
||||||
|
|
|
@ -1721,17 +1721,14 @@ merge_exception_specifiers (tree list, tree add)
|
||||||
{
|
{
|
||||||
if (!list || !add)
|
if (!list || !add)
|
||||||
return NULL_TREE;
|
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.
|
A throw(type-list) spec takes precedence over a noexcept(false) spec.
|
||||||
Any other noexcept-spec should only be merged with an equivalent one.
|
Any other noexcept-spec should only be merged with an equivalent one.
|
||||||
So the !TREE_VALUE code is correct for the latter two cases. */
|
So the !TREE_VALUE code below is correct for all cases. */
|
||||||
else if (list == noexcept_true_spec
|
|
||||||
|| add == noexcept_true_spec)
|
|
||||||
return noexcept_true_spec;
|
|
||||||
else if (!TREE_VALUE (list))
|
|
||||||
return add;
|
|
||||||
else if (!TREE_VALUE (add))
|
else if (!TREE_VALUE (add))
|
||||||
return list;
|
return list;
|
||||||
|
else if (!TREE_VALUE (list))
|
||||||
|
return add;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
tree orig_list = list;
|
tree orig_list = list;
|
||||||
|
|
|
@ -1,5 +1,8 @@
|
||||||
2010-06-04 Jason Merrill <jason@redhat.com>
|
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/noexcept01.C: New.
|
||||||
* g++.dg/cpp0x/noexcept02.C: New.
|
* g++.dg/cpp0x/noexcept02.C: New.
|
||||||
* g++.dg/cpp0x/noexcept03.C: New.
|
* g++.dg/cpp0x/noexcept03.C: New.
|
||||||
|
|
|
@ -0,0 +1,29 @@
|
||||||
|
// 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;
|
||||||
|
}
|
|
@ -0,0 +1,25 @@
|
||||||
|
// 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;
|
||||||
|
}
|
Loading…
Reference in New Issue