[PATCH] D33497: clang-tidy check for __func__/__FUNCTION__ in lambdas

Bryce Liu via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Wed May 24 08:46:48 PDT 2017

brycel added a comment.

In https://reviews.llvm.org/D33497#763307, @lebedev.ri wrote:

> 1. What about `__PRETTY_FUNCTION__` ?

`__PRETTY_FUNCTION__` is a little more useful, it at least tells you which function the lambda is defined in:

  #include <stdio.h>
  int main() {
    auto f = [] {
      printf("__func__: %s\n", __func__);
      printf("__FUNCTION__: %s\n", __FUNCTION__);
      printf("__PRETTY_FUNCTION__: %s\n", __PRETTY_FUNCTION__);

results in the output:

  __func__: operator()
  __FUNCTION__: operator()
  __PRETTY_FUNCTION__: auto main()::(anonymous class)::operator()() const

I think `__PRETTY_FUNCTION__` inside a lambda is useful enough not to warn about.

> 2. Consider following generic error handling macro: (ThrowException is some template function) ``` #undef STR #define STR(a) XSTR(a)
>   #define ThrowExceptionHelper(CLASS, fmt, ...) ThrowException<CLASS>(__FILE__ ":" STR(__LINE__) ": %s: " fmt, __PRETTY_FUNCTION__, ##__VA_ARGS__) #endif ``` Which is called like `if(somethig) ThrowException(std::exception, "%s", "bar");` Even though the function name may be useless, file/line info is still there and is(?) correct. Perhaps there should not be a warning in such a case?

That's a good point. I'll look into suppressing the warning if we're in a macro definition where `__FILE__` and `__LINE__` are both used. It may suppress some warnings that would be legitimate (such as if `__FILE__`/`__LINE__` are written but not actually output anywhere), but in those cases it's probably impossible to figure out the author's intention.


More information about the cfe-commits mailing list