labath added a subscriber: dblaikie.
labath added a comment.

Here's another interesting use of aritificial functions: inherited constructors.

  struct A { A(int); };
  struct B:A { using A::A; };
  B b(2);

The constructor B::B(int) will be marked artificial, but it is also not 
reconstructible from the debug info because it use explicit default 
initializers for all members in `B` (if they existed -- this example does not 
have any).

This example also demonstrates what I believe *is* a bug in the compiler. The 
inherited constructor will get `DW_AT_name(A)`:

  0x0000003f:   DW_TAG_structure_type
                  DW_AT_calling_convention      (DW_CC_pass_by_value)
                  DW_AT_name    ("B")
                  DW_AT_byte_size       (0x01)
                  DW_AT_decl_file       ("/home/pavelo/ll/build/opt/<stdin>")
                  DW_AT_decl_line       (1)
  
  0x00000048:     DW_TAG_inheritance
                    DW_AT_type  (0x0000005f "A")
                    DW_AT_data_member_location  (0x00)
  
  0x0000004e:     DW_TAG_subprogram
                    DW_AT_name  ("A")
                    DW_AT_declaration   (true)
                    DW_AT_artificial    (true)
                    DW_AT_external      (true)

That doesn't sound correct to me. Gcc emits the name as `B`, which seems to be 
much better. Looping in @dblaikie for thoughts.


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

https://reviews.llvm.org/D79811



_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to