On Fri, Oct 3, 2014 at 7:17 AM, Jason Merrill <[email protected]> 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