// RUN: %clang_analyze_cc1 -std=c++20 -analyzer-checker=core,debug.ExprInspection -analyzer-config inline-lambdas=true -verify %s #include "Inputs/system-header-simulator-cxx.h" void clang_analyzer_warnIfReached(); void clang_analyzer_eval(int); void capture_structured_binding_to_array_byref() { int arr[] {5}; auto& [i] = arr; [i]() mutable { if (i != 5) clang_analyzer_warnIfReached(); ++i; }(); [&i] { if (i != 5) clang_analyzer_warnIfReached(); }(); [&i] { if (i != 5) clang_analyzer_warnIfReached(); i++; }(); clang_analyzer_eval(i == 6); // expected-warning{{TRUE}} } void capture_structured_binding_to_array_byvalue() { int arr[] {5}; auto [i] = arr; [i]() mutable { if (i != 5) clang_analyzer_warnIfReached(); ++i; }(); [&i] { if (i != 5) clang_analyzer_warnIfReached(); }(); [&i] { if (i != 5) clang_analyzer_warnIfReached(); i++; }(); clang_analyzer_eval(i == 6); // expected-warning{{TRUE}} } void capture_structured_binding_to_tuple_like_byref() { std::pair p {5, 6}; auto& [i, _] = p; [i]() mutable { if (i != 5) clang_analyzer_warnIfReached(); ++i; }(); [&i] { if (i != 5) clang_analyzer_warnIfReached(); }(); [&i] { if (i != 5) clang_analyzer_warnIfReached(); i++; }(); clang_analyzer_eval(i == 6); // expected-warning{{TRUE}} } void capture_structured_binding_to_tuple_like_byvalue() { std::pair p {5, 6}; auto [i, _] = p; [i]() mutable { if (i != 5) clang_analyzer_warnIfReached(); ++i; }(); [&i] { if (i != 5) clang_analyzer_warnIfReached(); }(); [&i] { if (i != 5) clang_analyzer_warnIfReached(); i++; }(); clang_analyzer_eval(i == 6); // expected-warning{{TRUE}} } struct S { int x; }; void capture_structured_binding_to_data_member_byref() { S s{5}; auto& [i] = s; [i]() mutable { if (i != 5) clang_analyzer_warnIfReached(); ++i; }(); [&i] { if (i != 5) clang_analyzer_warnIfReached(); }(); [&i] { if (i != 5) clang_analyzer_warnIfReached(); i++; }(); clang_analyzer_eval(i == 6); // expected-warning{{TRUE}} } void capture_structured_binding_to_data_member_byvalue() { S s{5}; auto [i] = s; [i]() mutable { if (i != 5) clang_analyzer_warnIfReached(); ++i; }(); [&i] { if (i != 5) clang_analyzer_warnIfReached(); }(); [&i] { if (i != 5) clang_analyzer_warnIfReached(); i++; }(); clang_analyzer_eval(i == 6); // expected-warning{{TRUE}} }