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