On Fri, Oct 3, 2014 at 7:17 AM, Jason Merrill <ja...@redhat.com> wrote:
> On 10/03/2014 09:12 AM, Mark Wielaard wrote:
>>
>> A debugger not knowing whether a special member function was explicitly
>> defaulted, implicitly declared or explicitly defined seems less confusion
>> than not knowing whether it was deleted. But there are some subtle cases
>> where knowing whether a constructor was user defined or explicitly
>> defaulted do matter for whether the default constructor might have been
>> implicitly generated.
>
>
> Can you elaborate?
>
>> So like the deleted case this patch introduces
>> a new attribute DW_AT_GNU_defaulted that gets attached to the function
>> declaration. Note that since this is for declarations we explicitly
>> test for DECL_DEFAULTED_IN_CLASS_P and ignore any implementation
>> definitions that use = default; outside the class body.
>
>
> Hmm, I'm dubious about this choice.  How do you expect a consumer to use
> this information?

I apologize for gate crashing here...

Currently, there is no special attribute to indicate that a special
member function is declared = default. So, if you have a class
definition like this:

class A
{
public:
  A () {}
  ~A () = default;
  int a;
};

then, GDB sees the declaration of the destructor with no special
attributes (like DW_AT_artificial or similar) and thinks that the copy
constructor is user defined. Consequently, if there is a function
defined as:

A
make_a (int i)
{
  A a;
  a.a = i;

  return a;
}

Then, if a user invokes make_a at the GDB prompt, then GDB will
wrongly pass the pointer to the return value as a hidden first
parameter.

Question: Should special member functions declared = default be marked
DW_AT_artificial?

Thanks,
Siva Chandra

Reply via email to