1 | // RUN: %clang_analyze_cc1 -std=c++14 -analyzer-checker=core,deadcode,debug.ExprInspection -verify %s |
2 | |
3 | int clang_analyzer_eval(int); |
4 | |
5 | void generalizedCapture() { |
6 | int v = 7; |
7 | auto lambda = [x=v]() { |
8 | return x; |
9 | }; |
10 | |
11 | int result = lambda(); |
12 | clang_analyzer_eval(result == 7); // expected-warning {{TRUE}} |
13 | } |
14 | |
15 | void sideEffectsInGeneralizedCapture() { |
16 | int v = 7; |
17 | auto lambda = [x=v++]() { |
18 | return x; |
19 | }; |
20 | clang_analyzer_eval(v == 8); // expected-warning {{TRUE}} |
21 | |
22 | int r1 = lambda(); |
23 | int r2 = lambda(); |
24 | clang_analyzer_eval(r1 == 7); // expected-warning {{TRUE}} |
25 | clang_analyzer_eval(r2 == 7); // expected-warning {{TRUE}} |
26 | clang_analyzer_eval(v == 8); // expected-warning {{TRUE}} |
27 | } |
28 | |
29 | int addOne(int p) { |
30 | return p + 1; |
31 | } |
32 | |
33 | void inliningInGeneralizedCapture() { |
34 | int v = 7; |
35 | auto lambda = [x=addOne(v)]() { |
36 | return x; |
37 | }; |
38 | |
39 | int result = lambda(); |
40 | clang_analyzer_eval(result == 8); // expected-warning {{TRUE}} |
41 | } |
42 | |
43 | void caseSplitInGeneralizedCapture(bool p) { |
44 | auto lambda = [x=(p ? 1 : 2)]() { |
45 | return x; |
46 | }; |
47 | |
48 | int result = lambda(); |
49 | clang_analyzer_eval(result == 1); // expected-warning {{FALSE}} expected-warning {{TRUE}} |
50 | } |
51 | |