On 08/01/2015 07:31 PM, Nathan Sidwell wrote:
Ok, this patch fixes things up. The previous version was a little too lax, extending the logic of DR1611 to all synthesized functions. However, this broke virtual synthesized dtors, in that an abstract class's synthesized dtor's exception specification would not take account of any virtual base dtor exception specs. This would mean that a non-abstract derived class's synthesized dtor might end up with a throwing exception spec (because the virtual base's dtor did), and that would be looser than the exception spec on the abstract base's non-callable synthesized dtor. And that fails the virtual overriding checks.
It seems to me that DR 1658 ignores vbases of abstract classes for determining whether a destructor is deleted, but says nothing about exception specifications.
DR 1351 specifically ignores vbases of abstract classes for determining the exception specification of a constructor, but only for constructors.
So I think that for destructors we want to walk the base, but pass in a fake delete_p.
Why the check for inherited_parms? I would think that inheriting constructors would be handled like other ctors.
Jason