[PATCH] D68117: [DWARF-5] Support for C++11 defaulted, deleted member functions.

David Blaikie via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Fri Oct 18 15:27:58 PDT 2019


dblaikie added a subscriber: rsmith.
dblaikie added a comment.

In D68117#1714091 <https://reviews.llvm.org/D68117#1714091>, @SouraVX wrote:

> Hi @probinson @dblaikie  @aprantl , I've was investigating and working on your inputs regarding the problem with DW_at_defaulted once. I think clang has also some issues.


You think clang has bugs, independent of the debug info?

>   Though I'm not able to precisely point out. I ranned into some problems in CFE while marking out_of_class functions. i.e consider this for instance "debug-info-defaulted-out_of_class.cpp" FIXME:.  Causing too much trouble and possibly can introduce some bugs in clang/llvm. 
> 
> May be we'll reconsider this in future. Thanks for putting time in reviewing and discussing this.

Yeah, I looked at it a bit & asked @rsmith for some thoughts. Eventually wrapped my head around it.

Clang's codegen occurs during parsing - rather than parsing/AST building entirely, then code generating. So to take a smaller example:

  struct foo {
    foo();
    // virtual
    void f1();
    void f2();
  };
  void foo::f2() { }
  foo::foo() = default;

Without the virtual keyword, the first time the debug info needs the type (when building the description for f1's definition's "this" parameter) the foo::foo() = default definition hasn't been parsed yet, so there is no definition of foo::foo() available. (so the out of class defaulting isn't visible)

The reason virtual matters is that the actual class definition of 'foo' is never built - check the DWARF and metadata, only a declaration of "foo" is built. And the declarations of the member functions are injected into the declaration as the definitions are parsed, not before - so they observe the correct defaulting state.

Another way to show the bug is with -fstandalone-debug, even with a virtual function it shows the problem.

And moving 'f2' around (before/after 'foo()') also shows the problem - because having f2 first means the type definition (without virtual, or while using -fstandalone-debug) is built before any defaulting is seen - so 'foo()' isn't shown as defaulted.

All of this somewhat goes to my point - out of line defaulting should be tested and recorded on the out of line definition, not on the declaration, of a special member.

> Anyway here's the next course of action I'm considering. I'll be marking this review as abandoned. I'll raise a fresh new review for DW_AT_deleted feature, that;s pretty straight forward, considering C++ spec. If it's deleted, it has to be declared/defined{whatever} deleted in it's first declaration. This feature also augments the consumer information regarding which spl member functions are deleted, hence restrict their calling for user or do something useful with this at it's disposal.
> 
> @probinson @dblaikie @aprantl Please share your thoughts/comments inclination regarding adding this DW_AT_deleted to clang/llvm.

Sure, deleted support seems fine/reasonable/good to me.


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D68117/new/

https://reviews.llvm.org/D68117





More information about the cfe-commits mailing list