> On Feb 9, 2015, at 11:44 AM, David Blaikie <[email protected]> wrote:
> 
> 
> 
> On Mon, Feb 9, 2015 at 11:28 AM, Frédéric Riss <[email protected] 
> <mailto:[email protected]>> wrote:
> 
>> On Feb 9, 2015, at 11:09 AM, David Blaikie <[email protected] 
>> <mailto:[email protected]>> wrote:
>> 
>> 
>> 
>> On Mon, Feb 9, 2015 at 11:07 AM, Frédéric Riss <[email protected] 
>> <mailto:[email protected]>> wrote:
>> 
>> > On Feb 9, 2015, at 10:47 AM, David Blaikie <[email protected] 
>> > <mailto:[email protected]>> wrote:
>> >
>> > Author: dblaikie
>> > Date: Mon Feb  9 12:47:14 2015
>> > New Revision: 228588
>> >
>> > URL: http://llvm.org/viewvc/llvm-project?rev=228588&view=rev 
>> > <http://llvm.org/viewvc/llvm-project?rev=228588&view=rev>
>> > Log:
>> > DebugInfo: Suppress the location of instructions in aggregate default 
>> > arguments.
>> >
>> > Matches the existing code for scalar default arguments. Complex default
>> > arguments probably need the same handling too (test/fix to that coming
>> > next).
>> 
>> What was the behavior before that? Was the location set to the declaration 
>> with the default argument description?
>> 
>> Yes
>>  
>> I think I wouldn’t matter my debugger jumping there when the code actually 
>> does something non-trivial to initialize the argument(s).
>> 
>> Perhaps - though it is a bit jarring whenever you step passed a std::string, 
>> std::vector, etc ctor and leap into the standard library header to see the 
>> Allocator() ctor call, then go back to your code.
> 
> This is true, however from a purely semantic POV I think a ‘step’ should 
> really get you there. I mostly asked out of curiosity, I’m not objecting to 
> the change. I guess people could find it strange and that hiding the 
> initialization is a sane choice (although remembering the developer that 
> something non-trivial is happening here also has its advantages).
> 
> I'm not sure how to remind the developer in a sufficiently gentle way 
> (perhaps some way we could communicate this to a debugger & come up with an 
> appropriate debugger user experience) - default arguments are /really/ common 
> in C++. If we attributed their location to where the expression was written, 
> it would be very disruptive.
>  
> 
>> I do wonder if maybe the same is_stmt change we're discussing for dtors 
>> would be suitable here, so you don't step to it, but it does appear in the 
>> backtrace. Still awkward line table entry "foo() : basic_string:20473" or 
>> something - "wait, foo isn't in basic_string…".
> 
> Not sure I’m totally following here. The basic_string code in foo() should 
> appear as an inlined function, shouldn’t it?
> 
> It's not the body of basic_string's ctor, it's basic_string's ctor's default 
> argument (changed somewhat in C++14, but prior to that there was no no-args 
> ctor in basic_string, only one that took an Allocator and provided a default 
> value: http://en.cppreference.com/w/cpp/string/basic_string/basic_string 
> <http://en.cppreference.com/w/cpp/string/basic_string/basic_string> - but you 
> can see the other ctors that have the same default argument post-14, 
> including the common const char* converting ctor)
> 
> class basic_string {
>   basic_string(const Allocator &alloc = Allocator());
>   ...
> };
> 
> void func() {
>   basic_string s;
> }
> 
> In this code, there is a call to "Allocator()" in the body of func() - this 
> is not the inlined body of basic_string, it's not an inlined function of any 
> kind, the C++ language just says, basically, that the default argument 
> expression is evaluated in the context of the call site (modulo some stuff). 
> So the compiler generates that call to Allocator() at every call to 
> basic_string's construction with no args.

Thanks for the detailed example! It helped.

> So nexting through 'func()' would result in you jumping off to where 
> "Allocator()" was written, then jumping back to 'func()’.
> (you can try commenting out the code - refactored in r228589 - and debugging 
> some STL code)

Now I see where this is coming from. I wholeheartedly agree ‘next’ shouldn’t 
get you there. I was confused thinking that you changed what ‘step’ might do, 
but that didn’t make sense. Thanks for taking the time for the detailed answer.

Fred
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to