On Mon, Sep 09, 2013 at 11:37:31AM +0200, Richard Biener wrote: > > > > > this patchlet fixes the column # of the unused parameter warnings > > > > > emitted > > > > > by > > > > > do_warn_unused_parameter by explicitly passing DECL_SOURCE_LOCATION > > > > > (decl) > > > > > instead of wrongly relying on '+', which in this case ends up meaning > > > > > the > > > > > location of the function declaration. Tested x86_64-linux. > > > > I would have expected %q+D to use the location of the corresponding > > > > decl, not some random other location. So, isn't the bug in the > > > > C++ frontend diagnostic machinery? > > > Well, first notice that the patch fixes the issue *both* for the C and C++ > > > front-ends, that's why I added the testcase to c-c++-common. This isn't a > > > C++ > > > issue. Then notice that we do already have tens of cases where we use > > > DECL_SOURCE_LOCATION + %qD, when we want to be precise about the > > > location. The > > > diagnostic machinery has this mechanism using + which uses location_of, > > > which > > > is often useful for expressions, but which very often we don't use for > > > decls. > > > In fact, some people, like Manuel, see the audit trail of the bug, find > > > the > > > mechanism quite confusing. Is there something specific you want me to > > > check? > > > > How is '+' in %q+D defined? I failed to find documentation of the > > diagnostic formats (but only searched for like two minutes). > > That said, grepping for %q+D reveals quite some uses and it looks like > all of them expect the location being used to be that of the decl passed > to the diagnostic call, not some random other location.
The C++ FE locus handling is in very bad shape (C FE is much better, Aldy and others have spent quite some time fixing all the issues). I guess this is just one of the many issues. The most annoying to me is that the C++ FE for function calls uses the location of the closing ) of the call expression rather than the function name or at least opening (, so if you have a call_something (one_arg, second_arg, third_arg, fourth_arg, fifth_arg); you really don't see what is being called in the debugger when debugging C++. Jakub