1 // RUN: %clang_cc1 -std=c++14 -verify -fsyntax-only -Wshadow -D AVOID %s
2 // RUN: %clang_cc1 -std=c++14 -verify -fsyntax-only -Wshadow -Wshadow-uncaptured-local %s
3 // RUN: %clang_cc1 -std=c++14 -verify -fsyntax-only -Wshadow-all %s
5 void foo(int param) { // expected-note 1+ {{previous declaration is here}}
6 int var = 0; // expected-note 1+ {{previous declaration is here}}
8 // Avoid warnings for variables that aren't implicitly captured.
11 auto f1 = [=] { int var = 1; }; // no warning
12 auto f2 = [&] { int var = 2; }; // no warning
13 auto f3 = [=] (int param) { ; }; // no warning
14 auto f4 = [&] (int param) { ; }; // no warning
16 auto f1 = [=] { int var = 1; }; // expected-warning {{declaration shadows a local variable}}
17 auto f2 = [&] { int var = 2; }; // expected-warning {{declaration shadows a local variable}}
18 auto f3 = [=] (int param) { ; }; // expected-warning {{declaration shadows a local variable}}
19 auto f4 = [&] (int param) { ; }; // expected-warning {{declaration shadows a local variable}}
23 // Warn for variables that are implicitly captured.
27 int var = 1; // expected-warning {{declaration shadows a local variable}}
29 int x = var; // expected-note {{variable 'var' is captured here}}
35 (int param) { // expected-warning {{declaration shadows a local variable}}
37 int x = var; // expected-note {{variable 'var' is captured here}}
38 int var = param; // expected-warning {{declaration shadows a local variable}}
42 // Warn for variables that are explicitly captured when a lambda has a default
45 auto f1 = [=, &var] () { // expected-note {{variable 'var' is captured here}}
46 int x = param; // expected-note {{variable 'param' is captured here}}
47 int var = 0; // expected-warning {{declaration shadows a local variable}}
48 int param = 0; // expected-warning {{declaration shadows a local variable}}
52 // Warn normally inside of lambdas.
53 auto l1 = [] { // expected-note {{previous declaration is here}}
54 int x = 1; // expected-note {{previous declaration is here}}
55 { int x = 2; } // expected-warning {{declaration shadows a local variable}}
57 auto l2 = [] (int x) { // expected-note {{previous declaration is here}}
58 { int x = 1; } // expected-warning {{declaration shadows a local variable}}
61 // Avoid warnings for variables that aren't explicitly captured.
64 auto f1 = [] { int var = 1; }; // no warning
65 auto f2 = [] (int param) { ; }; // no warning
66 auto f3 = [param] () { int var = 1; }; // no warning
67 auto f4 = [var] (int param) { ; }; // no warning
69 auto f1 = [] { int var = 1; }; // expected-warning {{declaration shadows a local variable}}
70 auto f2 = [] (int param) { ; }; // expected-warning {{declaration shadows a local variable}}
71 auto f3 = [param] () { int var = 1; }; // expected-warning {{declaration shadows a local variable}}
72 auto f4 = [var] (int param) { ; }; // expected-warning {{declaration shadows a local variable}}
76 // Warn for variables that are explicitly captured.
78 auto f1 = [var] () { // expected-note {{variable 'var' is explicitly captured here}}
79 int var = 1; // expected-warning {{declaration shadows a local variable}}
81 auto f2 = [param] // expected-note {{variable 'param' is explicitly captured here}}
82 (int param) { ; }; // expected-warning {{declaration shadows a local variable}}
85 // Warn for variables defined in the capture list.
86 auto l3 = [z = var] { // expected-note {{previous declaration is here}}
88 int var = 1; // no warning
90 int var = 1; // expected-warning {{declaration shadows a local variable}}
92 { int z = 1; } // expected-warning {{declaration shadows a local variable}}
95 auto l4 = [var = param] (int param) { ; }; // no warning
97 auto l4 = [var = param] (int param) { ; }; // expected-warning {{declaration shadows a local variable}}
100 // Make sure that inner lambdas work as well.
101 auto l5 = [var, l1] { // expected-note {{variable 'l1' is explicitly captured here}}
102 auto l1 = [] { // expected-warning {{declaration shadows a local variable}}
104 int var = 1; // no warning
106 int var = 1; // expected-warning {{declaration shadows a local variable}}
110 auto f1 = [] { int var = 1; }; // no warning
111 auto f2 = [=] { int var = 1; }; // no warning
113 auto f1 = [] { int var = 1; }; // expected-warning {{declaration shadows a local variable}}
114 auto f2 = [=] { int var = 1; }; // expected-warning {{declaration shadows a local variable}}
116 auto f3 = [var] // expected-note {{variable 'var' is explicitly captured here}}
117 { int var = 1; }; // expected-warning {{declaration shadows a local variable}}
119 int x = var; // expected-note {{variable 'var' is captured here}}
120 int var = 2; // expected-warning {{declaration shadows a local variable}}
124 auto f1 = [param] { // expected-note {{variable 'param' is explicitly captured here}}
125 int param = 0; // expected-warning {{declaration shadows a local variable}}
129 // Generic lambda arguments should work.
131 auto g1 = [](auto param) { ; }; // no warning
132 auto g2 = [=](auto param) { ; }; // no warning
134 auto g1 = [](auto param) { ; }; // expected-warning {{declaration shadows a local variable}}
135 auto g2 = [=](auto param) { ; }; // expected-warning {{declaration shadows a local variable}}
137 auto g3 = [param] // expected-note {{variable 'param' is explicitly captured here}}
138 (auto param) { ; }; // expected-warning {{declaration shadows a local variable}}