| // 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<int, int> 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<int, int> 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}} |
| } |