malcolm.parsons marked an inline comment as done.
malcolm.parsons added inline comments.


================
Comment at: include/clang/Sema/ScopeInfo.h:457
+    /// lambda.
+    bool Used = false;
+
----------------
aaron.ballman wrote:
> arphaman wrote:
> > malcolm.parsons wrote:
> > > Should this be moved into one of the `PointerIntPair`s?
> > I'm not sure.. If we needed other capturing information in the future I 
> > would say that this should be its own field, but I'm not aware of anything 
> > else that's needed for this class. So I guess it would be better to pack it 
> > into `VarAndNestedAndThis`, but I wouldn't say it's a deal breaker.
> I'm not keen on inconsistently initializating data members; can you perform 
> this initialization in the constructor instead?
I'm not keen on repeating the initialization in every constructor.


================
Comment at: lib/Sema/SemaLambda.cpp:1479
     for (unsigned I = 0, N = LSI->Captures.size(); I != N; ++I, ++CurField) {
-      LambdaScopeInfo::Capture From = LSI->Captures[I];
+      LambdaScopeInfo::Capture &From = LSI->Captures[I];
       assert(!From.isBlockCapture() && "Cannot capture __block variables");
----------------
aaron.ballman wrote:
> Why does `From` need to be a non-const reference?
It's not related to the warning; it looks like an unnecessary copy.


================
Comment at: test/SemaCXX/warn-unused-lambda-capture.cpp:17
+  auto explicit_by_value_unused = [i] {}; // expected-warning{{lambda capture 
'i' is not used}}
+  auto explicit_by_value_unused_sizeof = [i] { return sizeof(i); }; // 
expected-warning{{lambda capture 'i' is not used}}
+
----------------
Quuxplusone wrote:
> aaron.ballman wrote:
> > This does not match the behavior for other -Wunused flags. e.g.,
> > ```
> > void f() {
> >   int i;
> >   (void)sizeof(i);
> > }
> > ```
> > I don't think diagnosing this test case is correct.
> I see some value to maybe diagnosing *something* here. For example, `[] { 
> return sizeof(i); }` would produce the same result as `[i] { return 
> sizeof(i); }` but with one fewer capture, so removing the `i` might be seen 
> as an improvement.
> 
> But I'm not sure how to convey this information to the user. You could say 
> "variable `i` used in unevaluated context refers to the `i` in the outer 
> scope, not the captured `i`"... except that I think that would be false. 
> Given that you *have* captured an `i`, `sizeof(i)` definitely refers to the 
> captured one AFAIK. The fact that the captured `i` shadows an `i` in the 
> outer scope is irrelevant --- in fact the user is *expecting* to shadow the 
> outer `i`.
> 
> Perhaps it would be appropriate to reword the diagnostic to "lambda captures 
> variable `i` unnecessarily".  I would also lean toward splitting it into two 
> diagnostics — one for "this capture is unnecessary" (as in this example) and 
> one for "this capture doesn't even appear lexically in the body of the 
> lambda". Not sure how other people would feel about that.
> 
> You should add some test cases with `decltype(i)` for the same reason as 
> `sizeof(i)`.
Does "lambda capture 'i' is not odr-used" make more sense?


================
Comment at: test/SemaCXX/warn-unused-lambda-capture.cpp:26
+  auto explicit_initialized_value_used = [j = 1] { return j + 1; };
+  auto explicit_initialized_value_unused = [j = 1] {}; // 
expected-warning{{lambda capture 'j' is not used}}
+
----------------
Quuxplusone wrote:
> Would this still produce a diagnostic if `decltype(j)` were something 
> complicated like `lock_guard` or `string`? Presumably it should do the same 
> thing, more or less, as the other -Wunused diagnostics, which I think is 
> "don't warn if the constructor/destructor might actually do important work".
I was planning to check for that; thanks for the reminder.


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