Commit 6d812dd3 by Jason Merrill Committed by Jason Merrill

* typeck.c (comp_except_specs): Fix ce_derived with noexcept.

From-SVN: r161130
parent f94ae987
2010-06-21 Jason Merrill <jason@redhat.com> 2010-06-21 Jason Merrill <jason@redhat.com>
* typeck.c (comp_except_specs): Fix ce_derived with noexcept.
* semantics.c (check_trait_type): Check COMPLETE_TYPE_P for array * semantics.c (check_trait_type): Check COMPLETE_TYPE_P for array
element type. element type.
......
...@@ -993,35 +993,37 @@ comp_except_specs (const_tree t1, const_tree t2, int exact) ...@@ -993,35 +993,37 @@ comp_except_specs (const_tree t1, const_tree t2, int exact)
const_tree probe; const_tree probe;
const_tree base; const_tree base;
int length = 0; int length = 0;
const_tree noexcept_spec = NULL_TREE;
const_tree other_spec;
if (t1 == t2) if (t1 == t2)
return true; return true;
/* First test noexcept compatibility. */ /* First handle noexcept. */
if (t1 && TREE_PURPOSE (t1)) if (exact < ce_exact)
noexcept_spec = t1, other_spec = t2; {
else if (t2 && TREE_PURPOSE (t2)) /* noexcept(false) is compatible with any throwing dynamic-exc-spec
noexcept_spec = t2, other_spec = t1; and stricter than any spec. */
if (noexcept_spec) if (t1 == noexcept_false_spec)
{ return !nothrow_spec_p (t2) || exact == ce_derived;
tree p = TREE_PURPOSE (noexcept_spec); /* Even a derived noexcept(false) is compatible with a throwing
/* Two noexcept-specs are equivalent iff their exprs are. */ dynamic spec. */
if (other_spec && TREE_PURPOSE (other_spec)) if (t2 == noexcept_false_spec)
return cp_tree_equal (p, TREE_PURPOSE (other_spec)); return !nothrow_spec_p (t1);
/* noexcept(true) is compatible with throw(). */
else if (exact < ce_exact && p == boolean_true_node) /* Otherwise, if we aren't looking for an exact match, noexcept is
return nothrow_spec_p (other_spec); equivalent to throw(). */
/* noexcept(false) is compatible with any throwing if (t1 == noexcept_true_spec)
dynamic-exception-spec. */ t1 = empty_except_spec;
else if (exact < ce_exact && p == boolean_false_node) if (t2 == noexcept_true_spec)
return !nothrow_spec_p (other_spec); t2 = empty_except_spec;
/* A dependent noexcept-spec is not compatible with any }
dynamic-exception-spec. */
else /* If any noexcept is left, it is only comparable to itself;
return false; either we're looking for an exact match or we're redeclaring a
} template with dependent noexcept. */
if ((t1 && TREE_PURPOSE (t1))
|| (t2 && TREE_PURPOSE (t2)))
return (t1 && t2
&& cp_tree_equal (TREE_PURPOSE (t1), TREE_PURPOSE (t2)));
if (t1 == NULL_TREE) /* T1 is ... */ if (t1 == NULL_TREE) /* T1 is ... */
return t2 == NULL_TREE || exact == ce_derived; return t2 == NULL_TREE || exact == ce_derived;
......
2010-06-21 Jason Merrill <jason@redhat.com> 2010-06-21 Jason Merrill <jason@redhat.com>
* g++.dg/cpp0x/noexcept08.C: New.
* g++.dg/ext/unary_trait_incomplete.C: Adjust. * g++.dg/ext/unary_trait_incomplete.C: Adjust.
2010-06-21 H.J. Lu <hongjiu.lu@intel.com> 2010-06-21 H.J. Lu <hongjiu.lu@intel.com>
......
// { dg-options "-std=c++0x" }
// { dg-prune-output "overriding" }
struct A
{
virtual void f();
virtual void g() throw();
virtual void h() noexcept;
virtual void i() noexcept(false);
virtual void j() throw(int);
};
struct B: A
{
void f() noexcept;
void g() noexcept;
void h() noexcept;
void i() noexcept;
void j() noexcept;
};
struct C: A
{
void f() throw();
void g() throw();
void h() throw();
void i() throw();
void j() throw();
};
struct D: A
{
void f() noexcept(false);
void g() noexcept(false); // { dg-error "looser" }
void h() noexcept(false); // { dg-error "looser" }
void i() noexcept(false);
void j() noexcept(false); // compatible; treated as throw(int)
};
struct E: A
{
void f() throw(int);
void g() throw(int); // { dg-error "looser" }
void h() throw(int); // { dg-error "looser" }
void i() throw(int);
void j() throw(int);
};
struct F: A
{
void f();
void g(); // { dg-error "looser" }
void h(); // { dg-error "looser" }
void i();
void j(); // { dg-error "looser" }
};
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