LLVM Bugzilla is read-only and represents the historical archive of all LLVM issues filled before November 26, 2021. Use github to submit LLVM bugs

Bug 45398 - -Wunused-lambda-capture: false positive on `if constexpr`
Summary: -Wunused-lambda-capture: false positive on `if constexpr`
Status: NEW
Alias: None
Product: clang
Classification: Unclassified
Component: C++17 (show other bugs)
Version: trunk
Hardware: All All
: P normal
Assignee: Unassigned Clang Bugs
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2020-04-02 01:38 PDT by Dmitri Gribenko
Modified: 2020-04-30 15:19 PDT (History)
7 users (show)

See Also:
Fixed By Commit(s):


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Dmitri Gribenko 2020-04-02 01:38:57 PDT
-Wunused-lambda-capture produces a false positive on lambdas that use captured variables within inactive branches of `if constexpr`.

$ ./bin/clang++ --version
clang version 11.0.0 (git@github.com:llvm/llvm-project.git cdce2fe561eb6e63d77d1d589e521a8e2afb1eef)
...
$ cat /tmp/unused-lambda-capture-false-positive.cc
template <int>
struct A {};
struct B {
  template <typename T, bool flag>
  void Top(T t, int n) {
    auto lambda = [t, n, this](auto arg) {
      if constexpr (flag) {
        UndefinedFunction(t, n);
      } else {
        TopImpl<A<arg>>();
      }
    };
  }
  template <typename U>
  void TopImpl() {}
};
void Test(B* b) {
  b->Top<int, false>(0, 0);
}
$ ./bin/clang++ -c -std=gnu++17 -Wunused-lambda-capture /tmp/unused-lambda-capture-false-positive.cc
/tmp/unused-lambda-capture-false-positive.cc:6:20: warning: lambda capture 't' is not used [-Wunused-lambda-capture]
    auto lambda = [t, n, this](auto arg) {
                   ^
/tmp/unused-lambda-capture-false-positive.cc:18:6: note: in instantiation of function template specialization 'B::Top<int, false>' requested here
  b->Top<int, false>(0, 0);
     ^
/tmp/unused-lambda-capture-false-positive.cc:6:23: warning: lambda capture 'n' is not used [-Wunused-lambda-capture]
    auto lambda = [t, n, this](auto arg) {
                      ^
/tmp/unused-lambda-capture-false-positive.cc:6:26: warning: lambda capture 'this' is not used [-Wunused-lambda-capture]
    auto lambda = [t, n, this](auto arg) {
                         ^
3 warnings generated.

ANALYSIS

The false positive on `this` might be a dup of https://bugs.llvm.org/show_bug.cgi?id=36880, however false positives on `t` and `n` seem diffirent.