krasin added a comment.

This change makes Clang hardly incompatible with MSVC++. Consider the following 
program:

  #include <stdio.h>
  
  int main(void) {
    const int kDelta = 10000001;
    auto g = [kDelta](int i)
             {
               printf("%d\n", i % kDelta);
             };
    g(2);
  }

Clang will warn about the unused lambda capture:

  $ clang++ lala.cc -o lala -std=c++14 -Wall -Werror && ./lala
  lala.cc:5:13: error: lambda capture 'kDelta' is not required to be captured 
for use in an unevaluated context [-Werror,-Wunused-lambda-capture]
    auto g = [kDelta](int i)
              ^
  1 error generated.

It will compile without any warnings if I remove kDelta from the list of 
captures:

  #include <stdio.h>
  
  int main(void) {
    const int kDelta = 10000001;
    auto g = [](int i)
             {
               printf("%d\n", i % kDelta);
             };
    g(2);
  }

But then Microsoft C++ compiler will raise the error:

  error C3493: 'kDelta' cannot be implicitly captured because no default 
capture mode has been specified

At this point, I am unsure how can this be improved, but I feel that pointing 
out this inconsistency might be useful.
For real world case, see https://codereview.chromium.org/2646553002/, where I 
tried to fix unused lambda captures in V8, in particular, this failure: 
https://build.chromium.org/p/tryserver.v8/builders/v8_win_rel_ng/builds/21172/steps/compile/logs/stdio


Repository:
  rL LLVM

https://reviews.llvm.org/D28467



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

Reply via email to