[cfe-dev] [clang-tidy] Some possible contributions

Piotr Dziwinski via cfe-dev cfe-dev at lists.llvm.org
Thu Dec 17 23:59:32 PST 2015

On 16/12/15 18:13, Richard via cfe-dev wrote:
> [Please reply *only* to the list and do not include my email directly
> in the To: or Cc: of your reply; otherwise I will not see your reply.
> Thanks.]
> In article <56709B81.2020403 at gmail.com>,
>      Piotr Dziwinski via cfe-dev <cfe-dev at lists.llvm.org> writes:
>> On 15/12/15 21:10, Richard via cfe-dev wrote:
>>> I remember now that I was looking into this for a check that would
>>> split a multiple variable declaration into multiple single variable
>>> declarations. [...]
>> Well, taking the assumption that all variable declarations are single
>> declarations would simplify my localizing variables checker a great deal
>> and make issue #1 obsolete.
> OK, good we're on the same thought track.
>> On the other hand, I worry about the decreased usability from the user's
>> point of view.
> Agreed.
>> He would have to first run the checker that splits multiple
>> declarations, applying its fixes everywhere.
>> Only then, as a second step, he would be able to run the localizing
>> variables checker, and use its fixes.
> How would a user feel if the localizing check broke down multiple
> delcarations into single declarations as a by-product?
> In other words:
> int i, j, k;
> // many lines of code
> i = 10;
> becomes
> int j;
> int k;
> // many lines of code
> int i = 10;
> Would this be unacceptable?

Well, my checker doesn't have anything against multiple declarations per 
se. There are cases where they are not considered a problem.
For example:

   int a, b;
   useByReference(a, b);

Here, both variables are already declared just before they are used so 
there is nothing to do, and no diagnostic is generated.
I would like to keep it like that, as any change suggested here, even 
if's just splitting the declarations, would be confusing to the user.

The only problem is when variables from multiple declaration statement 
must be moved, possibly to different locations.
In such case, since we are already changing the line with declaration, 
we might as well do as you suggest and split the declaration.
Actually, it would be quite simple to implement as well: remove the 
whole declaration and then insert individual variables as single 
either somewhere else if they are to be moved, or in the place of old 
declaration if they are to be left behind as they were.

However, if we go this way, there is a problem with generating the 
diagnostics in a sensible way.

So far, the idea was to have:
   1 diagnostic = 1 variable = 1 FixIt hint removal from old location = 
1 FixIt hint insertion at new location.

If we decide to do the splitting of multiple declarations the way I 
described, it would have to be:
  1 diagnostic = 1 (multiple) declaration statement = 1 FixIt hint 
removal from old location = 1 or more FixIt hint insertions for the 
individual variables.

I'm not sure if it is better or worse from the user's POV.

Perhaps you are right and the easiest way out would be to assume that 
all declarations are single declarations,
and let the user deal with multiple declarations by running another 
checker to split them.

Best regards,
Piotr Dziwinski

More information about the cfe-dev mailing list