Core 1191
Core 1191 * method.c (synthezized_method_walk): Cleanups don't affect the triviality of a constructor, but do affect deletion and exception specification. From-SVN: r171011
This commit is contained in:
parent
437697b8ee
commit
92d0652c1e
4 changed files with 37 additions and 21 deletions
|
@ -1,3 +1,10 @@
|
|||
2011-03-15 Jason Merrill <jason@redhat.com>
|
||||
|
||||
Core 1191
|
||||
* method.c (synthesized_method_walk): Cleanups don't affect the
|
||||
triviality of a constructor, but do affect deletion and exception
|
||||
specification.
|
||||
|
||||
2011-03-15 Rodrigo Rivas Costa <rodrigorivascosta@gmail.com>
|
||||
|
||||
* decl2.c (cp_check_const_attributes): New.
|
||||
|
|
|
@ -1080,14 +1080,9 @@ synthesized_method_walk (tree ctype, special_function_kind sfk, bool const_p,
|
|||
tsubst_flags_t complain;
|
||||
const char *msg;
|
||||
bool ctor_p;
|
||||
tree cleanup_spec;
|
||||
bool cleanup_trivial = true;
|
||||
bool cleanup_deleted = false;
|
||||
|
||||
cleanup_spec
|
||||
= (cxx_dialect >= cxx0x ? noexcept_true_spec : empty_except_spec);
|
||||
if (spec_p)
|
||||
*spec_p = cleanup_spec;
|
||||
*spec_p = (cxx_dialect >= cxx0x ? noexcept_true_spec : empty_except_spec);
|
||||
|
||||
if (deleted_p)
|
||||
{
|
||||
|
@ -1228,8 +1223,10 @@ synthesized_method_walk (tree ctype, special_function_kind sfk, bool const_p,
|
|||
destructors for cleanup of partially constructed objects. */
|
||||
rval = locate_fn_flags (base_binfo, complete_dtor_identifier,
|
||||
NULL_TREE, flags, complain);
|
||||
process_subob_fn (rval, false, &cleanup_spec, &cleanup_trivial,
|
||||
&cleanup_deleted, NULL, NULL,
|
||||
/* Note that we don't pass down trivial_p; the subobject
|
||||
destructors don't affect triviality of the constructor. */
|
||||
process_subob_fn (rval, false, spec_p, NULL,
|
||||
deleted_p, NULL, NULL,
|
||||
basetype);
|
||||
}
|
||||
|
||||
|
@ -1275,8 +1272,8 @@ synthesized_method_walk (tree ctype, special_function_kind sfk, bool const_p,
|
|||
{
|
||||
rval = locate_fn_flags (base_binfo, complete_dtor_identifier,
|
||||
NULL_TREE, flags, complain);
|
||||
process_subob_fn (rval, false, &cleanup_spec, &cleanup_trivial,
|
||||
&cleanup_deleted, NULL, NULL,
|
||||
process_subob_fn (rval, false, spec_p, NULL,
|
||||
deleted_p, NULL, NULL,
|
||||
basetype);
|
||||
}
|
||||
}
|
||||
|
@ -1295,23 +1292,14 @@ synthesized_method_walk (tree ctype, special_function_kind sfk, bool const_p,
|
|||
if (ctor_p)
|
||||
walk_field_subobs (TYPE_FIELDS (ctype), complete_dtor_identifier,
|
||||
sfk_destructor, TYPE_UNQUALIFIED, false,
|
||||
false, false, &cleanup_spec, &cleanup_trivial,
|
||||
&cleanup_deleted, NULL,
|
||||
false, false, spec_p, NULL,
|
||||
deleted_p, NULL,
|
||||
NULL, flags, complain);
|
||||
|
||||
pop_scope (scope);
|
||||
|
||||
--cp_unevaluated_operand;
|
||||
--c_inhibit_evaluation_warnings;
|
||||
|
||||
/* If the constructor isn't trivial, consider the subobject cleanups. */
|
||||
if (ctor_p && trivial_p && !*trivial_p)
|
||||
{
|
||||
if (deleted_p && cleanup_deleted)
|
||||
*deleted_p = true;
|
||||
if (spec_p)
|
||||
*spec_p = merge_exception_specifiers (*spec_p, cleanup_spec);
|
||||
}
|
||||
}
|
||||
|
||||
/* DECL is a deleted function. If it's implicitly deleted, explain why and
|
||||
|
|
|
@ -1,3 +1,7 @@
|
|||
2011-03-15 Jason Merrill <jason@redhat.com>
|
||||
|
||||
* g++.dg/cpp0x/implicit11.C: New.
|
||||
|
||||
2011-03-15 Rodrigo Rivas Costa <rodrigorivascosta@gmail.com>
|
||||
|
||||
* g++.dg/cpp0x/constexpr-attribute.C: New.
|
||||
|
|
17
gcc/testsuite/g++.dg/cpp0x/implicit11.C
Normal file
17
gcc/testsuite/g++.dg/cpp0x/implicit11.C
Normal file
|
@ -0,0 +1,17 @@
|
|||
// Test that we consider base dtors in determining whether
|
||||
// a derived ctor is deleted even if the ctor is trivial.
|
||||
// { dg-options -std=c++0x }
|
||||
|
||||
struct A
|
||||
{
|
||||
~A() = delete; // { dg-error "declared here" }
|
||||
};
|
||||
|
||||
struct B: A { }; // { dg-error "deleted" }
|
||||
|
||||
extern B eb;
|
||||
int main()
|
||||
{
|
||||
B* b1 = new B; // { dg-error "use of deleted function" "" { xfail *-*-* } }
|
||||
B* b2 = new B(eb); // { dg-error "use of deleted function" }
|
||||
}
|
Loading…
Add table
Reference in a new issue