[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