[cfe-dev] [clang-tidy] Some possible contributions
Piotr Dziwinski via cfe-dev
cfe-dev at lists.llvm.org
Tue Sep 1 15:02:35 PDT 2015
@Legalize Adulthood: Thanks, I'll soon try to come up with some ideas
for localizing variables and I will post some proposal.
Meanwhile, in case of my inconsistent parameter name check, I ran into
some difficulties related to templates, as I wrote in a comment in the
review.
Take this code for example:
template<typename T>
void foo(T a);
template<>
void foo(int b) {}
I want to find here mismatch between parameter name in template
declaration and specialization. In my current implementation I get the
following output:
src.cpp:4:16: warning: function 'foo' has other declaration with
different parameter name
[readability-inconsistent-declaration-parameter-name]
template<>void foo(int b) {}
^
src.cpp:4:16: note: other declaration seen here
template<>void foo(int b) {}
^
src.cpp:4:24: note: parameter 1 is named 'b' here, but 'a' in other
declaration
template<>void foo(int b) {}
So it seems to work fine, but shows wrong location for the other
declaration.
I traced it down to what I think is incorrect location reporting, or at
least confusing behavior of getLocation() function.
When I visit redeclarations of template specialization, I get something
that I assume is generated function declaration from the earlier
template declaration. When I call dump() on it, I get:
FunctionDecl 0x1a4dad0 <src.cpp:2:1, col:13> line:4:16 foo 'void (int)'
|-TemplateArgument type 'int'
`-ParmVarDecl 0x1a4da10 <line:2:10, col:12> col:12 a 'int':'int'
So everything seems fine, we get the template declaration argument name,
which we can check. But when I output that diagnostic, I call
getLocation(), and I get 'src.cpp:4:16', so the location of template
specialization, not template declaration.
Now, of course I can work around it by calling
getPrimaryTemplate()->getLocation(), but it seems a sort of hack, which
applies only in this one case. So I have to ask: isn't there a universal
way of getting correct location that works in all cases?
Also, another thing I would like to see in the output, would be a nice
way of printing function name with template specialization arguments in
diagnostic, for example: "function 'foo<int>' has other declaration
(...)". Is there a standard way of doing this, or do I have to write my
code for that?
Best regards,
Piotr Dziwinski
On 2015-08-31 22:26, Richard via cfe-dev wrote:
> In article <55DF408A.5080208 at gmail.com>,
> Piotr Dziwinski via cfe-dev <cfe-dev at lists.llvm.org> writes:
>
>> Patch proposal #1: add check for inconsistent parameter names in
>> function declarations
> Nice!
>
>> Patch proposal #2: add check for instances of old C-style functions
> Also nice!
>
> I've subscribed to the reviews in phabricator. If you'd like to
> discuss ideas/implementation for localizing variables in "old C-style
> functions", I'm happy to participate in that either on-list or
> off-list.
More information about the cfe-dev
mailing list