128 lines · cpp
1// RUN: %clang_analyze_cc1 -std=c++20 -analyzer-checker=core,debug.ExprInspection -analyzer-config inline-lambdas=true -verify %s2 3#include "Inputs/system-header-simulator-cxx.h"4void clang_analyzer_warnIfReached();5void clang_analyzer_eval(int);6 7void capture_structured_binding_to_array_byref() {8 int arr[] {5};9 auto& [i] = arr;10 [i]() mutable {11 if (i != 5)12 clang_analyzer_warnIfReached();13 ++i;14 }();15 [&i] {16 if (i != 5)17 clang_analyzer_warnIfReached();18 }();19 [&i] {20 if (i != 5)21 clang_analyzer_warnIfReached();22 i++;23 }();24 clang_analyzer_eval(i == 6); // expected-warning{{TRUE}}25}26 27void capture_structured_binding_to_array_byvalue() {28 int arr[] {5};29 auto [i] = arr;30 [i]() mutable {31 if (i != 5)32 clang_analyzer_warnIfReached();33 ++i;34 }();35 [&i] {36 if (i != 5)37 clang_analyzer_warnIfReached();38 }();39 [&i] {40 if (i != 5)41 clang_analyzer_warnIfReached();42 i++;43 }();44 clang_analyzer_eval(i == 6); // expected-warning{{TRUE}}45}46 47void capture_structured_binding_to_tuple_like_byref() {48 std::pair<int, int> p {5, 6};49 auto& [i, _] = p;50 [i]() mutable {51 if (i != 5)52 clang_analyzer_warnIfReached();53 ++i;54 }();55 [&i] {56 if (i != 5)57 clang_analyzer_warnIfReached();58 }();59 [&i] {60 if (i != 5)61 clang_analyzer_warnIfReached();62 i++;63 }();64 clang_analyzer_eval(i == 6); // expected-warning{{TRUE}}65}66 67void capture_structured_binding_to_tuple_like_byvalue() {68 std::pair<int, int> p {5, 6};69 auto [i, _] = p;70 [i]() mutable {71 if (i != 5)72 clang_analyzer_warnIfReached();73 ++i;74 }();75 [&i] {76 if (i != 5)77 clang_analyzer_warnIfReached();78 }();79 [&i] {80 if (i != 5)81 clang_analyzer_warnIfReached();82 i++;83 }();84 clang_analyzer_eval(i == 6); // expected-warning{{TRUE}}85}86 87struct S { int x; };88 89void capture_structured_binding_to_data_member_byref() {90 S s{5};91 auto& [i] = s;92 [i]() mutable {93 if (i != 5)94 clang_analyzer_warnIfReached();95 ++i;96 }();97 [&i] {98 if (i != 5)99 clang_analyzer_warnIfReached();100 }();101 [&i] {102 if (i != 5)103 clang_analyzer_warnIfReached();104 i++;105 }();106 clang_analyzer_eval(i == 6); // expected-warning{{TRUE}}107}108 109void capture_structured_binding_to_data_member_byvalue() {110 S s{5};111 auto [i] = s;112 [i]() mutable {113 if (i != 5)114 clang_analyzer_warnIfReached();115 ++i;116 }();117 [&i] {118 if (i != 5)119 clang_analyzer_warnIfReached();120 }();121 [&i] {122 if (i != 5)123 clang_analyzer_warnIfReached();124 i++;125 }();126 clang_analyzer_eval(i == 6); // expected-warning{{TRUE}}127}128