blob: f4b1c92637d2275708968bc7c5b0e637b9091980 [file] [log] [blame]
Malcolm Parsons87a03622017-01-13 15:01:06 +00001// RUN: %clang_cc1 -fsyntax-only -Wunused-lambda-capture -Wused-but-marked-unused -Wno-uninitialized -verify -std=c++14 %s
2
3class NonTrivialConstructor {
4public:
5 NonTrivialConstructor() {}
6};
7
8class NonTrivialDestructor {
9public:
10 ~NonTrivialDestructor() {}
11};
12
13class Trivial {
14public:
15 Trivial() = default;
16 Trivial(int a) {}
17};
18
19int side_effect() {
20 return 42;
21}
22
23void test() {
24 int i = 0;
Malcolm Parsonsbece0cd2017-01-19 17:19:22 +000025 const int k = 0;
Malcolm Parsons87a03622017-01-13 15:01:06 +000026
27 auto captures_nothing = [] {};
28
29 auto captures_nothing_by_value = [=] {};
30 auto captures_nothing_by_reference = [&] {};
31
32 auto implicit_by_value = [=]() mutable { i++; };
33 auto implicit_by_reference = [&] { i++; };
34
35 auto explicit_by_value_used = [i] { return i + 1; };
36 auto explicit_by_value_used_void = [i] { (void)i; };
37 auto explicit_by_value_unused = [i] {}; // expected-warning{{lambda capture 'i' is not used}}
Malcolm Parsonsbece0cd2017-01-19 17:19:22 +000038 auto explicit_by_value_unused_sizeof = [i] { return sizeof(i); }; // expected-warning{{lambda capture 'i' is not required to be captured for this use}}
39 auto explicit_by_value_unused_decltype = [i] { decltype(i) j = 0; }; // expected-warning{{lambda capture 'i' is not required to be captured for this use}}
40 auto explicit_by_value_unused_const = [k] { return k + 1; }; // expected-warning{{lambda capture 'k' is not required to be captured for this use}}
Malcolm Parsons87a03622017-01-13 15:01:06 +000041
42 auto explicit_by_reference_used = [&i] { i++; };
43 auto explicit_by_reference_unused = [&i] {}; // expected-warning{{lambda capture 'i' is not used}}
44
45 auto explicit_initialized_reference_used = [&j = i] { return j + 1; };
46 auto explicit_initialized_reference_unused = [&j = i]{}; // expected-warning{{lambda capture 'j' is not used}}
47
48 auto explicit_initialized_value_used = [j = 1] { return j + 1; };
49 auto explicit_initialized_value_unused = [j = 1] {}; // expected-warning{{lambda capture 'j' is not used}}
50 auto explicit_initialized_value_non_trivial_constructor = [j = NonTrivialConstructor()]{};
51 auto explicit_initialized_value_non_trivial_destructor = [j = NonTrivialDestructor()]{};
52 auto explicit_initialized_value_trivial_init = [j = Trivial()]{}; // expected-warning{{lambda capture 'j' is not used}}
53 auto explicit_initialized_value_non_trivial_init = [j = Trivial(42)]{};
54 auto explicit_initialized_value_with_side_effect = [j = side_effect()]{};
55
56 auto nested = [&i] {
57 auto explicit_by_value_used = [i] { return i + 1; };
58 auto explicit_by_value_unused = [i] {}; // expected-warning{{lambda capture 'i' is not used}}
59 };
60}
61
62class Foo
63{
64 void test() {
65 auto explicit_this_used = [this] { return i; };
66 auto explicit_this_used_void = [this] { (void)this; };
67 auto explicit_this_unused = [this] {}; // expected-warning{{lambda capture 'this' is not used}}
68 }
69 int i;
70};
71
72template <typename T>
73void test_templated() {
74 int i = 0;
Malcolm Parsonsbece0cd2017-01-19 17:19:22 +000075 const int k = 0;
Malcolm Parsons87a03622017-01-13 15:01:06 +000076
77 auto captures_nothing = [] {};
78
79 auto captures_nothing_by_value = [=] {};
80 auto captures_nothing_by_reference = [&] {};
81
82 auto implicit_by_value = [=]() mutable { i++; };
83 auto implicit_by_reference = [&] { i++; };
84
85 auto explicit_by_value_used = [i] { return i + 1; };
86 auto explicit_by_value_used_void = [i] { (void)i; };
87 auto explicit_by_value_unused = [i] {}; // expected-warning{{lambda capture 'i' is not used}}
Malcolm Parsonsbece0cd2017-01-19 17:19:22 +000088 auto explicit_by_value_unused_sizeof = [i] { return sizeof(i); }; // expected-warning{{lambda capture 'i' is not required to be captured for this use}}
Malcolm Parsons87a03622017-01-13 15:01:06 +000089 auto explicit_by_value_unused_decltype = [i] { decltype(i) j = 0; }; // expected-warning{{lambda capture 'i' is not used}}
Malcolm Parsonsbece0cd2017-01-19 17:19:22 +000090 auto explicit_by_value_unused_const = [k] { return k + 1; }; // expected-warning{{lambda capture 'k' is not required to be captured for this use}}
Malcolm Parsons87a03622017-01-13 15:01:06 +000091
92 auto explicit_by_reference_used = [&i] { i++; };
93 auto explicit_by_reference_unused = [&i] {}; // expected-warning{{lambda capture 'i' is not used}}
94
95 auto explicit_initialized_reference_used = [&j = i] { return j + 1; };
96 auto explicit_initialized_reference_unused = [&j = i]{}; // expected-warning{{lambda capture 'j' is not used}}
97
98 auto explicit_initialized_value_used = [j = 1] { return j + 1; };
99 auto explicit_initialized_value_unused = [j = 1] {}; // expected-warning{{lambda capture 'j' is not used}}
100 auto explicit_initialized_value_non_trivial_constructor = [j = NonTrivialConstructor()]{};
101 auto explicit_initialized_value_non_trivial_destructor = [j = NonTrivialDestructor()]{};
102 auto explicit_initialized_value_trivial_init = [j = Trivial()]{}; // expected-warning{{lambda capture 'j' is not used}}
103 auto explicit_initialized_value_non_trivial_init = [j = Trivial(42)]{};
104 auto explicit_initialized_value_with_side_effect = [j = side_effect()]{};
105
106 auto nested = [&i] {
107 auto explicit_by_value_used = [i] { return i + 1; };
108 auto explicit_by_value_unused = [i] {}; // expected-warning{{lambda capture 'i' is not used}}
109 };
110}
111
112void test_use_template() {
113 test_templated<int>(); // expected-note{{in instantiation of function template specialization 'test_templated<int>' requested here}}
114}