diff options
Diffstat (limited to 'clang/test')
7 files changed, 116 insertions, 6 deletions
diff --git a/clang/test/CXX/expr/expr.prim/expr.prim.lambda/p12.cpp b/clang/test/CXX/expr/expr.prim/expr.prim.lambda/p12.cpp index 4a2a4f3d735..e7fce11abc5 100644 --- a/clang/test/CXX/expr/expr.prim/expr.prim.lambda/p12.cpp +++ b/clang/test/CXX/expr/expr.prim/expr.prim.lambda/p12.cpp @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -std=c++11 %s -Wunused -verify +// RUN: %clang_cc1 -std=c++11 %s -Wunused -Wno-unused-lambda-capture -verify void odr_used() { int i = 17; diff --git a/clang/test/CXX/expr/expr.prim/expr.prim.lambda/p13.cpp b/clang/test/CXX/expr/expr.prim/expr.prim.lambda/p13.cpp index 8bb707e0dbc..b55beb7d4ed 100644 --- a/clang/test/CXX/expr/expr.prim/expr.prim.lambda/p13.cpp +++ b/clang/test/CXX/expr/expr.prim/expr.prim.lambda/p13.cpp @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -std=c++11 %s -Wunused -verify +// RUN: %clang_cc1 -std=c++11 %s -Wunused -Wno-unused-lambda-capture -verify void f2() { int i = 1; diff --git a/clang/test/CXX/expr/expr.prim/expr.prim.lambda/p16.cpp b/clang/test/CXX/expr/expr.prim/expr.prim.lambda/p16.cpp index 94f8111015a..905192ff830 100644 --- a/clang/test/CXX/expr/expr.prim/expr.prim.lambda/p16.cpp +++ b/clang/test/CXX/expr/expr.prim/expr.prim.lambda/p16.cpp @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -std=c++11 %s -Wunused -verify +// RUN: %clang_cc1 -std=c++11 %s -Wunused -Wno-unused-lambda-capture -verify struct X { diff --git a/clang/test/CXX/expr/expr.prim/expr.prim.lambda/p18.cpp b/clang/test/CXX/expr/expr.prim/expr.prim.lambda/p18.cpp index 93c2805497f..72cf93be519 100644 --- a/clang/test/CXX/expr/expr.prim/expr.prim.lambda/p18.cpp +++ b/clang/test/CXX/expr/expr.prim/expr.prim.lambda/p18.cpp @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -std=c++11 %s -Wunused -verify +// RUN: %clang_cc1 -std=c++11 %s -Wunused -Wno-unused-lambda-capture -verify // expected-no-diagnostics template<typename T, typename U> diff --git a/clang/test/CXX/expr/expr.prim/expr.prim.lambda/p19.cpp b/clang/test/CXX/expr/expr.prim/expr.prim.lambda/p19.cpp index 1dbcbf49803..a8b40249f0f 100644 --- a/clang/test/CXX/expr/expr.prim/expr.prim.lambda/p19.cpp +++ b/clang/test/CXX/expr/expr.prim/expr.prim.lambda/p19.cpp @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -std=c++11 %s -Wunused -verify +// RUN: %clang_cc1 -std=c++11 %s -Wunused -Wno-unused-lambda-capture -verify struct MoveOnly { MoveOnly(MoveOnly&&); diff --git a/clang/test/SemaCXX/uninitialized.cpp b/clang/test/SemaCXX/uninitialized.cpp index 5769a0c028c..51a2d687205 100644 --- a/clang/test/SemaCXX/uninitialized.cpp +++ b/clang/test/SemaCXX/uninitialized.cpp @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -fsyntax-only -Wall -Wuninitialized -Wno-unused-value -std=c++11 -verify %s +// RUN: %clang_cc1 -fsyntax-only -Wall -Wuninitialized -Wno-unused-value -Wno-unused-lambda-capture -std=c++11 -verify %s // definitions for std::move namespace std { diff --git a/clang/test/SemaCXX/warn-unused-lambda-capture.cpp b/clang/test/SemaCXX/warn-unused-lambda-capture.cpp new file mode 100644 index 00000000000..18c5d6483d2 --- /dev/null +++ b/clang/test/SemaCXX/warn-unused-lambda-capture.cpp @@ -0,0 +1,110 @@ +// RUN: %clang_cc1 -fsyntax-only -Wunused-lambda-capture -Wused-but-marked-unused -Wno-uninitialized -verify -std=c++14 %s + +class NonTrivialConstructor { +public: + NonTrivialConstructor() {} +}; + +class NonTrivialDestructor { +public: + ~NonTrivialDestructor() {} +}; + +class Trivial { +public: + Trivial() = default; + Trivial(int a) {} +}; + +int side_effect() { + return 42; +} + +void test() { + int i = 0; + + auto captures_nothing = [] {}; + + auto captures_nothing_by_value = [=] {}; + auto captures_nothing_by_reference = [&] {}; + + auto implicit_by_value = [=]() mutable { i++; }; + auto implicit_by_reference = [&] { i++; }; + + auto explicit_by_value_used = [i] { return i + 1; }; + auto explicit_by_value_used_void = [i] { (void)i; }; + 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 required to be captured for use in an unevaluated context}} + auto explicit_by_value_unused_decltype = [i] { decltype(i) j = 0; }; // expected-warning{{lambda capture 'i' is not required to be captured for use in an unevaluated context}} + + auto explicit_by_reference_used = [&i] { i++; }; + auto explicit_by_reference_unused = [&i] {}; // expected-warning{{lambda capture 'i' is not used}} + + auto explicit_initialized_reference_used = [&j = i] { return j + 1; }; + auto explicit_initialized_reference_unused = [&j = i]{}; // expected-warning{{lambda capture 'j' is not used}} + + 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}} + auto explicit_initialized_value_non_trivial_constructor = [j = NonTrivialConstructor()]{}; + auto explicit_initialized_value_non_trivial_destructor = [j = NonTrivialDestructor()]{}; + auto explicit_initialized_value_trivial_init = [j = Trivial()]{}; // expected-warning{{lambda capture 'j' is not used}} + auto explicit_initialized_value_non_trivial_init = [j = Trivial(42)]{}; + auto explicit_initialized_value_with_side_effect = [j = side_effect()]{}; + + auto nested = [&i] { + auto explicit_by_value_used = [i] { return i + 1; }; + auto explicit_by_value_unused = [i] {}; // expected-warning{{lambda capture 'i' is not used}} + }; +} + +class Foo +{ + void test() { + auto explicit_this_used = [this] { return i; }; + auto explicit_this_used_void = [this] { (void)this; }; + auto explicit_this_unused = [this] {}; // expected-warning{{lambda capture 'this' is not used}} + } + int i; +}; + +template <typename T> +void test_templated() { + int i = 0; + + auto captures_nothing = [] {}; + + auto captures_nothing_by_value = [=] {}; + auto captures_nothing_by_reference = [&] {}; + + auto implicit_by_value = [=]() mutable { i++; }; + auto implicit_by_reference = [&] { i++; }; + + auto explicit_by_value_used = [i] { return i + 1; }; + auto explicit_by_value_used_void = [i] { (void)i; }; + 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 required to be captured for use in an unevaluated context}} + auto explicit_by_value_unused_decltype = [i] { decltype(i) j = 0; }; // expected-warning{{lambda capture 'i' is not used}} + + auto explicit_by_reference_used = [&i] { i++; }; + auto explicit_by_reference_unused = [&i] {}; // expected-warning{{lambda capture 'i' is not used}} + + auto explicit_initialized_reference_used = [&j = i] { return j + 1; }; + auto explicit_initialized_reference_unused = [&j = i]{}; // expected-warning{{lambda capture 'j' is not used}} + + 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}} + auto explicit_initialized_value_non_trivial_constructor = [j = NonTrivialConstructor()]{}; + auto explicit_initialized_value_non_trivial_destructor = [j = NonTrivialDestructor()]{}; + auto explicit_initialized_value_trivial_init = [j = Trivial()]{}; // expected-warning{{lambda capture 'j' is not used}} + auto explicit_initialized_value_non_trivial_init = [j = Trivial(42)]{}; + auto explicit_initialized_value_with_side_effect = [j = side_effect()]{}; + + auto nested = [&i] { + auto explicit_by_value_used = [i] { return i + 1; }; + auto explicit_by_value_unused = [i] {}; // expected-warning{{lambda capture 'i' is not used}} + }; +} + +void test_use_template() { + test_templated<int>(); // expected-note{{in instantiation of function template specialization 'test_templated<int>' requested here}} +} |