aaron.ballman added a comment.

In D139705#4216449 <https://reviews.llvm.org/D139705#4216449>, 
@tomasz-kaminski-sonarsource wrote:

> In D139705#4216417 <https://reviews.llvm.org/D139705#4216417>, @erichkeane 
> wrote:
>
>> In D139705#4215653 <https://reviews.llvm.org/D139705#4215653>, 
>> @tomasz-kaminski-sonarsource wrote:
>>
>>> As a downstream, we have concerns with this change. From what I saw it 
>>> breaks the behavior of the fix-it that wants to remove the whole variable 
>>> definition (including the initializer). For example, I have unused, that I 
>>> want to remove variable `x` and unnecessary explicit specialization 
>>> `temp<double>`:
>>>
>>>   template<typename T>
>>>   T temp = 1;
>>>   
>>>   int x  = 10;
>>>   template<> double temp<double> = 1;
>>>
>>> Previously, this could be handled (in case of single variable declaration) 
>>> by simply removing up the `var->getSourceRange()` with succeeding coma. 
>>> However, after the change, such code does not work, and in general if 
>>> `getSourceRange()` is used on `VarDecl` (or even `Decl`), special 
>>> consideration needs to be taken for the situation when `VarDecl` refers to 
>>> variable template specialization.
>>>
>>> As an alternative, I would suggest introducing an additional function to 
>>> `VarDecl` (which could be moved up in the hierarchy), that would report a 
>>> source range that corresponds to //declarator-id//, i.e. for template 
>>> variable it would include template arguments.
>>
>> Hmm... I'm being a little dense here I guess, I don't understand what you 
>> mean?  Does this result in one of our fixits being wrong here?  With the old 
>> range, wouldn't it have left the `<double>` in that case, and now is 
>> removing it?  Or what am I missing?
>
> Before the change, for both `x` and `temp<double>`, prior to the change the 
> `getSourceRange()` on the `VarDecl` that represents them includes an 
> initializer (they end just before `;`). But now for the variable template 
> specialization, we end up just after template arguments. This means that 
> fixit/report that previously covered the whole definition, will now not 
> include an initializer.
> Or in our example:
>
>   template<typename T>
>   T temp = 1;
>        // v getSourceRange() ends on this token before and after the change
>   int x = 10;
>                                 // v getSourceRange() ends on this token 
> prior to the change, consistently with normal variables
>   template<> double temp<double> = 1;
>                             // ^ getSourceRange() ends on this token after 
> the change, making it inconsistent

Thank you for the further explanation, that clarified the concern for me as 
well. I think I agree with you -- we used to cover the full source range for 
the AST node, and now we only cover part of it because we're missing the 
initializer. We want `getSourceRange()` to cover the full range of text for the 
node, so we should have a different function to access the more limited range. 
@v1nh1shungry is this something you'd feel comfortable fixing up?


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D139705/new/

https://reviews.llvm.org/D139705

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to