George Karpenkov | 96625fd | 2018-01-02 23:05:47 +0000 | [diff] [blame] | 1 | // RUN: %clang_analyze_cc1 -std=c++11 -fblocks -analyzer-checker=core,debug.ExprInspection -verify %s -o %t.report |
| 2 | // RUN: %clang_analyze_cc1 -std=c++11 -fblocks -analyzer-checker=core,debug.ExprInspection -DEMULATE_LIBSTDCPP -verify %s -o %t.report |
George Karpenkov | 657a589 | 2017-09-30 00:03:22 +0000 | [diff] [blame] | 3 | |
George Karpenkov | 0354483 | 2017-11-03 00:36:03 +0000 | [diff] [blame] | 4 | // We do NOT model libcxx03 implementation, but the analyzer should still |
| 5 | // not crash. |
George Karpenkov | 96625fd | 2018-01-02 23:05:47 +0000 | [diff] [blame] | 6 | // RUN: %clang_analyze_cc1 -std=c++11 -fblocks -analyzer-checker=core,debug.ExprInspection -DEMULATE_LIBCXX03 -verify %s -o %t.report |
| 7 | // RUN: %clang_analyze_cc1 -std=c++11 -fblocks -analyzer-checker=core,debug.ExprInspection -DEMULATE_LIBCXX03 -DEMULATE_LIBSTDCPP -verify %s -o %t.report |
| 8 | // RUN: rm -rf %t.report |
George Karpenkov | 0354483 | 2017-11-03 00:36:03 +0000 | [diff] [blame] | 9 | |
George Karpenkov | 657a589 | 2017-09-30 00:03:22 +0000 | [diff] [blame] | 10 | void clang_analyzer_eval(bool); |
| 11 | |
| 12 | // Faking std::std::call_once implementation. |
| 13 | namespace std { |
George Karpenkov | c928e1f | 2017-10-11 20:53:01 +0000 | [diff] [blame] | 14 | |
| 15 | #ifndef EMULATE_LIBSTDCPP |
George Karpenkov | 657a589 | 2017-09-30 00:03:22 +0000 | [diff] [blame] | 16 | typedef struct once_flag_s { |
| 17 | unsigned long __state_ = 0; |
| 18 | } once_flag; |
George Karpenkov | c928e1f | 2017-10-11 20:53:01 +0000 | [diff] [blame] | 19 | #else |
| 20 | typedef struct once_flag_s { |
| 21 | int _M_once = 0; |
| 22 | } once_flag; |
| 23 | #endif |
George Karpenkov | 657a589 | 2017-09-30 00:03:22 +0000 | [diff] [blame] | 24 | |
George Karpenkov | 0354483 | 2017-11-03 00:36:03 +0000 | [diff] [blame] | 25 | #ifndef EMULATE_LIBCXX03 |
George Karpenkov | 657a589 | 2017-09-30 00:03:22 +0000 | [diff] [blame] | 26 | template <class Callable, class... Args> |
George Karpenkov | b2a60c6 | 2017-10-17 22:28:18 +0000 | [diff] [blame] | 27 | void call_once(once_flag &o, Callable&& func, Args&&... args) {}; |
George Karpenkov | 0354483 | 2017-11-03 00:36:03 +0000 | [diff] [blame] | 28 | #else |
| 29 | template <class Callable, class... Args> // libcxx03 call_once |
| 30 | void call_once(once_flag &o, Callable func, Args&&... args) {}; |
| 31 | #endif |
George Karpenkov | c928e1f | 2017-10-11 20:53:01 +0000 | [diff] [blame] | 32 | |
George Karpenkov | 657a589 | 2017-09-30 00:03:22 +0000 | [diff] [blame] | 33 | } // namespace std |
| 34 | |
| 35 | // Check with Lambdas. |
| 36 | void test_called_warning() { |
| 37 | std::once_flag g_initialize; |
| 38 | int z; |
| 39 | |
| 40 | std::call_once(g_initialize, [&] { |
| 41 | int *x = nullptr; |
George Karpenkov | 0354483 | 2017-11-03 00:36:03 +0000 | [diff] [blame] | 42 | #ifndef EMULATE_LIBCXX03 |
George Karpenkov | 657a589 | 2017-09-30 00:03:22 +0000 | [diff] [blame] | 43 | int y = *x; // expected-warning{{Dereference of null pointer (loaded from variable 'x')}} |
George Karpenkov | 0354483 | 2017-11-03 00:36:03 +0000 | [diff] [blame] | 44 | #endif |
George Karpenkov | 657a589 | 2017-09-30 00:03:22 +0000 | [diff] [blame] | 45 | z = 200; |
| 46 | }); |
| 47 | } |
| 48 | |
| 49 | void test_called_on_path_inside_no_warning() { |
| 50 | std::once_flag g_initialize; |
| 51 | |
| 52 | int *x = nullptr; |
| 53 | int y = 100; |
| 54 | int z; |
| 55 | |
| 56 | std::call_once(g_initialize, [&] { |
| 57 | z = 200; |
| 58 | x = &z; |
| 59 | }); |
| 60 | |
George Karpenkov | 0354483 | 2017-11-03 00:36:03 +0000 | [diff] [blame] | 61 | #ifndef EMULATE_LIBCXX03 |
George Karpenkov | 657a589 | 2017-09-30 00:03:22 +0000 | [diff] [blame] | 62 | *x = 100; // no-warning |
| 63 | clang_analyzer_eval(z == 100); // expected-warning{{TRUE}} |
George Karpenkov | 0354483 | 2017-11-03 00:36:03 +0000 | [diff] [blame] | 64 | #endif |
George Karpenkov | 657a589 | 2017-09-30 00:03:22 +0000 | [diff] [blame] | 65 | } |
| 66 | |
| 67 | void test_called_on_path_no_warning() { |
| 68 | std::once_flag g_initialize; |
| 69 | |
| 70 | int *x = nullptr; |
| 71 | int y = 100; |
| 72 | |
| 73 | std::call_once(g_initialize, [&] { |
| 74 | x = &y; |
| 75 | }); |
| 76 | |
George Karpenkov | 0354483 | 2017-11-03 00:36:03 +0000 | [diff] [blame] | 77 | #ifndef EMULATE_LIBCXX03 |
George Karpenkov | 657a589 | 2017-09-30 00:03:22 +0000 | [diff] [blame] | 78 | *x = 100; // no-warning |
George Karpenkov | 0354483 | 2017-11-03 00:36:03 +0000 | [diff] [blame] | 79 | #else |
| 80 | *x = 100; // expected-warning{{Dereference of null pointer (loaded from variable 'x')}} |
| 81 | #endif |
George Karpenkov | 657a589 | 2017-09-30 00:03:22 +0000 | [diff] [blame] | 82 | } |
| 83 | |
| 84 | void test_called_on_path_warning() { |
| 85 | std::once_flag g_initialize; |
| 86 | |
| 87 | int y = 100; |
| 88 | int *x = &y; |
| 89 | |
| 90 | std::call_once(g_initialize, [&] { |
| 91 | x = nullptr; |
| 92 | }); |
| 93 | |
George Karpenkov | 0354483 | 2017-11-03 00:36:03 +0000 | [diff] [blame] | 94 | #ifndef EMULATE_LIBCXX03 |
George Karpenkov | 657a589 | 2017-09-30 00:03:22 +0000 | [diff] [blame] | 95 | *x = 100; // expected-warning{{Dereference of null pointer (loaded from variable 'x')}} |
George Karpenkov | 0354483 | 2017-11-03 00:36:03 +0000 | [diff] [blame] | 96 | #endif |
George Karpenkov | 657a589 | 2017-09-30 00:03:22 +0000 | [diff] [blame] | 97 | } |
| 98 | |
| 99 | void test_called_once_warning() { |
| 100 | std::once_flag g_initialize; |
| 101 | |
| 102 | int *x = nullptr; |
| 103 | int y = 100; |
| 104 | |
| 105 | std::call_once(g_initialize, [&] { |
| 106 | x = nullptr; |
| 107 | }); |
| 108 | |
| 109 | std::call_once(g_initialize, [&] { |
| 110 | x = &y; |
| 111 | }); |
| 112 | |
George Karpenkov | 0354483 | 2017-11-03 00:36:03 +0000 | [diff] [blame] | 113 | #ifndef EMULATE_LIBCXX03 |
George Karpenkov | 657a589 | 2017-09-30 00:03:22 +0000 | [diff] [blame] | 114 | *x = 100; // expected-warning{{Dereference of null pointer (loaded from variable 'x')}} |
George Karpenkov | 0354483 | 2017-11-03 00:36:03 +0000 | [diff] [blame] | 115 | #endif |
George Karpenkov | 657a589 | 2017-09-30 00:03:22 +0000 | [diff] [blame] | 116 | } |
| 117 | |
| 118 | void test_called_once_no_warning() { |
| 119 | std::once_flag g_initialize; |
| 120 | |
| 121 | int *x = nullptr; |
| 122 | int y = 100; |
| 123 | |
| 124 | std::call_once(g_initialize, [&] { |
| 125 | x = &y; |
| 126 | }); |
| 127 | |
| 128 | std::call_once(g_initialize, [&] { |
| 129 | x = nullptr; |
| 130 | }); |
| 131 | |
George Karpenkov | 0354483 | 2017-11-03 00:36:03 +0000 | [diff] [blame] | 132 | #ifndef EMULATE_LIBCXX03 |
George Karpenkov | 657a589 | 2017-09-30 00:03:22 +0000 | [diff] [blame] | 133 | *x = 100; // no-warning |
George Karpenkov | 0354483 | 2017-11-03 00:36:03 +0000 | [diff] [blame] | 134 | #endif |
George Karpenkov | 657a589 | 2017-09-30 00:03:22 +0000 | [diff] [blame] | 135 | } |
| 136 | |
| 137 | static int global = 0; |
| 138 | void funcPointer() { |
| 139 | global = 1; |
| 140 | } |
| 141 | |
| 142 | void test_func_pointers() { |
| 143 | static std::once_flag flag; |
| 144 | std::call_once(flag, &funcPointer); |
George Karpenkov | 0354483 | 2017-11-03 00:36:03 +0000 | [diff] [blame] | 145 | #ifndef EMULATE_LIBCXX03 |
George Karpenkov | 657a589 | 2017-09-30 00:03:22 +0000 | [diff] [blame] | 146 | clang_analyzer_eval(global == 1); // expected-warning{{TRUE}} |
George Karpenkov | 0354483 | 2017-11-03 00:36:03 +0000 | [diff] [blame] | 147 | #endif |
George Karpenkov | 657a589 | 2017-09-30 00:03:22 +0000 | [diff] [blame] | 148 | } |
| 149 | |
| 150 | template <class _Fp> |
| 151 | class function; // undefined |
| 152 | template <class _Rp, class... _ArgTypes> |
| 153 | struct function<_Rp(_ArgTypes...)> { |
George Karpenkov | 305ee8e | 2017-09-30 01:15:35 +0000 | [diff] [blame] | 154 | _Rp operator()(_ArgTypes...) const {}; |
George Karpenkov | 657a589 | 2017-09-30 00:03:22 +0000 | [diff] [blame] | 155 | template <class _Fp> |
George Karpenkov | 305ee8e | 2017-09-30 01:15:35 +0000 | [diff] [blame] | 156 | function(_Fp) {}; |
George Karpenkov | 657a589 | 2017-09-30 00:03:22 +0000 | [diff] [blame] | 157 | }; |
| 158 | |
| 159 | // Note: currently we do not support calls to std::function, |
| 160 | // but the analyzer should not crash either. |
| 161 | void test_function_objects_warning() { |
| 162 | int x = 0; |
| 163 | int *y = &x; |
| 164 | |
| 165 | std::once_flag flag; |
| 166 | |
| 167 | function<void()> func = [&]() { |
| 168 | y = nullptr; |
| 169 | }; |
| 170 | |
| 171 | std::call_once(flag, func); |
| 172 | |
| 173 | func(); |
| 174 | int z = *y; |
| 175 | } |
| 176 | |
| 177 | void test_param_passing_lambda() { |
| 178 | std::once_flag flag; |
| 179 | int x = 120; |
| 180 | int y = 0; |
| 181 | |
| 182 | std::call_once(flag, [&](int p) { |
| 183 | y = p; |
| 184 | }, |
| 185 | x); |
| 186 | |
George Karpenkov | 0354483 | 2017-11-03 00:36:03 +0000 | [diff] [blame] | 187 | #ifndef EMULATE_LIBCXX03 |
George Karpenkov | 657a589 | 2017-09-30 00:03:22 +0000 | [diff] [blame] | 188 | clang_analyzer_eval(y == 120); // expected-warning{{TRUE}} |
George Karpenkov | 0354483 | 2017-11-03 00:36:03 +0000 | [diff] [blame] | 189 | #endif |
George Karpenkov | 657a589 | 2017-09-30 00:03:22 +0000 | [diff] [blame] | 190 | } |
| 191 | |
| 192 | void test_param_passing_lambda_false() { |
| 193 | std::once_flag flag; |
| 194 | int x = 120; |
| 195 | |
| 196 | std::call_once(flag, [&](int p) { |
| 197 | x = 0; |
| 198 | }, |
| 199 | x); |
| 200 | |
George Karpenkov | 0354483 | 2017-11-03 00:36:03 +0000 | [diff] [blame] | 201 | #ifndef EMULATE_LIBCXX03 |
George Karpenkov | 657a589 | 2017-09-30 00:03:22 +0000 | [diff] [blame] | 202 | clang_analyzer_eval(x == 120); // expected-warning{{FALSE}} |
George Karpenkov | 0354483 | 2017-11-03 00:36:03 +0000 | [diff] [blame] | 203 | #endif |
George Karpenkov | 657a589 | 2017-09-30 00:03:22 +0000 | [diff] [blame] | 204 | } |
| 205 | |
| 206 | void test_param_passing_stored_lambda() { |
| 207 | std::once_flag flag; |
| 208 | int x = 120; |
| 209 | int y = 0; |
| 210 | |
| 211 | auto lambda = [&](int p) { |
| 212 | y = p; |
| 213 | }; |
| 214 | |
| 215 | std::call_once(flag, lambda, x); |
George Karpenkov | 0354483 | 2017-11-03 00:36:03 +0000 | [diff] [blame] | 216 | #ifndef EMULATE_LIBCXX03 |
George Karpenkov | 657a589 | 2017-09-30 00:03:22 +0000 | [diff] [blame] | 217 | clang_analyzer_eval(y == 120); // expected-warning{{TRUE}} |
George Karpenkov | 0354483 | 2017-11-03 00:36:03 +0000 | [diff] [blame] | 218 | #endif |
George Karpenkov | 657a589 | 2017-09-30 00:03:22 +0000 | [diff] [blame] | 219 | } |
| 220 | |
| 221 | void test_multiparam_passing_lambda() { |
| 222 | std::once_flag flag; |
| 223 | int x = 120; |
| 224 | |
| 225 | std::call_once(flag, [&](int a, int b, int c) { |
| 226 | x = a + b + c; |
| 227 | }, |
| 228 | 1, 2, 3); |
| 229 | |
George Karpenkov | 0354483 | 2017-11-03 00:36:03 +0000 | [diff] [blame] | 230 | #ifndef EMULATE_LIBCXX03 |
George Karpenkov | 657a589 | 2017-09-30 00:03:22 +0000 | [diff] [blame] | 231 | clang_analyzer_eval(x == 120); // expected-warning{{FALSE}} |
| 232 | clang_analyzer_eval(x == 6); // expected-warning{{TRUE}} |
George Karpenkov | 0354483 | 2017-11-03 00:36:03 +0000 | [diff] [blame] | 233 | #endif |
George Karpenkov | 657a589 | 2017-09-30 00:03:22 +0000 | [diff] [blame] | 234 | } |
| 235 | |
| 236 | static int global2 = 0; |
| 237 | void test_param_passing_lambda_global() { |
| 238 | std::once_flag flag; |
| 239 | global2 = 0; |
| 240 | std::call_once(flag, [&](int a, int b, int c) { |
| 241 | global2 = a + b + c; |
| 242 | }, |
| 243 | 1, 2, 3); |
George Karpenkov | 0354483 | 2017-11-03 00:36:03 +0000 | [diff] [blame] | 244 | #ifndef EMULATE_LIBCXX03 |
George Karpenkov | 657a589 | 2017-09-30 00:03:22 +0000 | [diff] [blame] | 245 | clang_analyzer_eval(global2 == 6); // expected-warning{{TRUE}} |
George Karpenkov | 0354483 | 2017-11-03 00:36:03 +0000 | [diff] [blame] | 246 | #endif |
George Karpenkov | 657a589 | 2017-09-30 00:03:22 +0000 | [diff] [blame] | 247 | } |
| 248 | |
| 249 | static int global3 = 0; |
| 250 | void funcptr(int a, int b, int c) { |
| 251 | global3 = a + b + c; |
| 252 | } |
| 253 | |
| 254 | void test_param_passing_funcptr() { |
| 255 | std::once_flag flag; |
| 256 | global3 = 0; |
| 257 | |
| 258 | std::call_once(flag, &funcptr, 1, 2, 3); |
| 259 | |
George Karpenkov | 0354483 | 2017-11-03 00:36:03 +0000 | [diff] [blame] | 260 | #ifndef EMULATE_LIBCXX03 |
George Karpenkov | 657a589 | 2017-09-30 00:03:22 +0000 | [diff] [blame] | 261 | clang_analyzer_eval(global3 == 6); // expected-warning{{TRUE}} |
George Karpenkov | 0354483 | 2017-11-03 00:36:03 +0000 | [diff] [blame] | 262 | #endif |
George Karpenkov | 657a589 | 2017-09-30 00:03:22 +0000 | [diff] [blame] | 263 | } |
| 264 | |
| 265 | void test_blocks() { |
| 266 | global3 = 0; |
| 267 | std::once_flag flag; |
| 268 | std::call_once(flag, ^{ |
| 269 | global3 = 120; |
| 270 | }); |
George Karpenkov | 0354483 | 2017-11-03 00:36:03 +0000 | [diff] [blame] | 271 | #ifndef EMULATE_LIBCXX03 |
George Karpenkov | 657a589 | 2017-09-30 00:03:22 +0000 | [diff] [blame] | 272 | clang_analyzer_eval(global3 == 120); // expected-warning{{TRUE}} |
George Karpenkov | 0354483 | 2017-11-03 00:36:03 +0000 | [diff] [blame] | 273 | #endif |
George Karpenkov | 657a589 | 2017-09-30 00:03:22 +0000 | [diff] [blame] | 274 | } |
| 275 | |
| 276 | int call_once() { |
| 277 | return 5; |
| 278 | } |
| 279 | |
| 280 | void test_non_std_call_once() { |
| 281 | int x = call_once(); |
George Karpenkov | 0354483 | 2017-11-03 00:36:03 +0000 | [diff] [blame] | 282 | #ifndef EMULATE_LIBCXX03 |
George Karpenkov | 657a589 | 2017-09-30 00:03:22 +0000 | [diff] [blame] | 283 | clang_analyzer_eval(x == 5); // expected-warning{{TRUE}} |
George Karpenkov | 0354483 | 2017-11-03 00:36:03 +0000 | [diff] [blame] | 284 | #endif |
George Karpenkov | 657a589 | 2017-09-30 00:03:22 +0000 | [diff] [blame] | 285 | } |
George Karpenkov | 8b53f7c | 2017-10-09 23:20:46 +0000 | [diff] [blame] | 286 | |
| 287 | namespace std { |
| 288 | template <typename d, typename e> |
| 289 | void call_once(d, e); |
| 290 | } |
| 291 | void g(); |
| 292 | void test_no_segfault_on_different_impl() { |
George Karpenkov | 0354483 | 2017-11-03 00:36:03 +0000 | [diff] [blame] | 293 | #ifndef EMULATE_LIBCXX03 |
George Karpenkov | 8b53f7c | 2017-10-09 23:20:46 +0000 | [diff] [blame] | 294 | std::call_once(g, false); // no-warning |
George Karpenkov | 0354483 | 2017-11-03 00:36:03 +0000 | [diff] [blame] | 295 | #endif |
George Karpenkov | 8b53f7c | 2017-10-09 23:20:46 +0000 | [diff] [blame] | 296 | } |
George Karpenkov | bd4254c | 2017-10-20 23:29:59 +0000 | [diff] [blame] | 297 | |
| 298 | void test_lambda_refcapture() { |
| 299 | static std::once_flag flag; |
| 300 | int a = 6; |
| 301 | std::call_once(flag, [&](int &a) { a = 42; }, a); |
George Karpenkov | 0354483 | 2017-11-03 00:36:03 +0000 | [diff] [blame] | 302 | #ifndef EMULATE_LIBCXX03 |
George Karpenkov | bd4254c | 2017-10-20 23:29:59 +0000 | [diff] [blame] | 303 | clang_analyzer_eval(a == 42); // expected-warning{{TRUE}} |
George Karpenkov | 0354483 | 2017-11-03 00:36:03 +0000 | [diff] [blame] | 304 | #endif |
George Karpenkov | bd4254c | 2017-10-20 23:29:59 +0000 | [diff] [blame] | 305 | } |
| 306 | |
| 307 | void test_lambda_refcapture2() { |
| 308 | static std::once_flag flag; |
| 309 | int a = 6; |
| 310 | std::call_once(flag, [=](int &a) { a = 42; }, a); |
George Karpenkov | 0354483 | 2017-11-03 00:36:03 +0000 | [diff] [blame] | 311 | #ifndef EMULATE_LIBCXX03 |
George Karpenkov | bd4254c | 2017-10-20 23:29:59 +0000 | [diff] [blame] | 312 | clang_analyzer_eval(a == 42); // expected-warning{{TRUE}} |
George Karpenkov | 0354483 | 2017-11-03 00:36:03 +0000 | [diff] [blame] | 313 | #endif |
George Karpenkov | bd4254c | 2017-10-20 23:29:59 +0000 | [diff] [blame] | 314 | } |
| 315 | |
| 316 | void test_lambda_fail_refcapture() { |
| 317 | static std::once_flag flag; |
| 318 | int a = 6; |
| 319 | std::call_once(flag, [=](int a) { a = 42; }, a); |
George Karpenkov | 0354483 | 2017-11-03 00:36:03 +0000 | [diff] [blame] | 320 | #ifndef EMULATE_LIBCXX03 |
George Karpenkov | bd4254c | 2017-10-20 23:29:59 +0000 | [diff] [blame] | 321 | clang_analyzer_eval(a == 42); // expected-warning{{FALSE}} |
George Karpenkov | 0354483 | 2017-11-03 00:36:03 +0000 | [diff] [blame] | 322 | #endif |
George Karpenkov | bd4254c | 2017-10-20 23:29:59 +0000 | [diff] [blame] | 323 | } |
| 324 | |
| 325 | void mutator(int ¶m) { |
| 326 | param = 42; |
| 327 | } |
| 328 | void test_reftypes_funcptr() { |
| 329 | static std::once_flag flag; |
| 330 | int a = 6; |
| 331 | std::call_once(flag, &mutator, a); |
George Karpenkov | 0354483 | 2017-11-03 00:36:03 +0000 | [diff] [blame] | 332 | #ifndef EMULATE_LIBCXX03 |
George Karpenkov | bd4254c | 2017-10-20 23:29:59 +0000 | [diff] [blame] | 333 | clang_analyzer_eval(a == 42); // expected-warning{{TRUE}} |
George Karpenkov | 0354483 | 2017-11-03 00:36:03 +0000 | [diff] [blame] | 334 | #endif |
George Karpenkov | bd4254c | 2017-10-20 23:29:59 +0000 | [diff] [blame] | 335 | } |
| 336 | |
| 337 | void fail_mutator(int param) { |
| 338 | param = 42; |
| 339 | } |
| 340 | void test_mutator_noref() { |
| 341 | static std::once_flag flag; |
| 342 | int a = 6; |
| 343 | std::call_once(flag, &fail_mutator, a); |
George Karpenkov | 0354483 | 2017-11-03 00:36:03 +0000 | [diff] [blame] | 344 | #ifndef EMULATE_LIBCXX03 |
George Karpenkov | bd4254c | 2017-10-20 23:29:59 +0000 | [diff] [blame] | 345 | clang_analyzer_eval(a == 42); // expected-warning{{FALSE}} |
George Karpenkov | 0354483 | 2017-11-03 00:36:03 +0000 | [diff] [blame] | 346 | #endif |
George Karpenkov | bd4254c | 2017-10-20 23:29:59 +0000 | [diff] [blame] | 347 | } |
George Karpenkov | 98e81cd | 2017-10-24 00:13:18 +0000 | [diff] [blame] | 348 | |
| 349 | // Function is implicitly treated as a function pointer |
| 350 | // even when an ampersand is not explicitly set. |
| 351 | void callbackn(int ¶m) { |
| 352 | param = 42; |
George Karpenkov | f671bd2 | 2017-10-25 00:03:45 +0000 | [diff] [blame] | 353 | } |
George Karpenkov | 98e81cd | 2017-10-24 00:13:18 +0000 | [diff] [blame] | 354 | void test_implicit_funcptr() { |
| 355 | int x = 0; |
| 356 | static std::once_flag flagn; |
| 357 | |
| 358 | std::call_once(flagn, callbackn, x); |
George Karpenkov | 0354483 | 2017-11-03 00:36:03 +0000 | [diff] [blame] | 359 | #ifndef EMULATE_LIBCXX03 |
George Karpenkov | 98e81cd | 2017-10-24 00:13:18 +0000 | [diff] [blame] | 360 | clang_analyzer_eval(x == 42); // expected-warning{{TRUE}} |
George Karpenkov | 0354483 | 2017-11-03 00:36:03 +0000 | [diff] [blame] | 361 | #endif |
George Karpenkov | 98e81cd | 2017-10-24 00:13:18 +0000 | [diff] [blame] | 362 | } |