lebedev.ri added a comment.

In https://reviews.llvm.org/D37014#850064, @tbourvon wrote:

> In https://reviews.llvm.org/D37014#849157, @lebedev.ri wrote:
>
> > Please add the following test: (and make sure that it does the right thing 
> > :))
> >
> >   bool f_with_preproc_condition() {
> >     auto test = 42;
> >     assert(test == 42);
> >     return test;
> >   }
> >
> >
> > I.e. if `-DNDEBUG` is present, variable is not needed, but if `-DNDEBUG` is 
> > *NOT* present...
>
>
> Shouldn't we ignore these cases whether or not `-DNDEBUG` is present?


That's *exactly* what i was talking about.

> If we apply the fix here and remove the variable while we have `-DNDEBUG`, 
> and then remove this define, then we'll get a compiler error for `test` not 
> found.
>  In this case it can be fixed fairly easily, but this could in fact introduce 
> bugs with more complex conditional macros and preprocessor directives. For 
> example:
> 
>   #ifdef WIN32
>   #define MY_MACRO(test) test = 0
>   #else
>   #define MY_MACRO(test) /* nothing */
>   #endif
>   
>   bool f() {
>     auto test = 42;
>     MY_MACRO(test);
>     return (test == 42);
>   }
> 
> 
> If we want to ignore these cases not matter what, which seems to me like the 
> most logical and reasonable thing to do, we need to be able to know if there 
> are preprocessor directives between the variable declaration and the `return` 
> statement.
>  In order to do that, we would need to be able to get the 
> `PreprocessingRecord` of the current compilation in order to call 
> getPreprocessedEntitiesInRange() 
> <https://clang.llvm.org/doxygen/classclang_1_1PreprocessingRecord.html#a1f5d06d192dad434958ff00975aaaddd>,
>  but AFAICT this cannot be accessed from clang-tidy checks at the moment. 
> Should we introduce a way to reach that object from checks?

Currently, there is a `registerPPCallbacks()` function in `ClangTidyCheck` 
class,  which allows you to register a subclass of `PPCallbacks`, and manually 
handle all the preprocessor thingies.
That being said, getPreprocessedEntitiesInRange() 
<https://clang.llvm.org/doxygen/classclang_1_1PreprocessingRecord.html#a1f5d06d192dad434958ff00975aaaddd>
 looks interesting, and it *might* help me in https://reviews.llvm.org/D36836.


Repository:
  rL LLVM

https://reviews.llvm.org/D37014



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

Reply via email to