| // RUN: %clang_cc1 -analyze -analyzer-checker=core,unix.Malloc,cplusplus.NewDelete,debug.ExprInspection -analyzer-config c++-container-inlining=true -analyzer-config c++-stdlib-inlining=false -std=c++11 -verify %s |
| // RUN: %clang_cc1 -analyze -analyzer-checker=core,unix.Malloc,cplusplus.NewDelete,debug.ExprInspection -analyzer-config c++-container-inlining=true -analyzer-config c++-stdlib-inlining=true -std=c++11 -DINLINE=1 -verify %s |
| |
| #include "../Inputs/system-header-simulator-cxx.h" |
| |
| void clang_analyzer_eval(bool); |
| |
| void testVector(std::vector<int> &nums) { |
| if (nums.begin()) return; |
| if (nums.end()) return; |
| |
| clang_analyzer_eval(nums.size() == 0); |
| #if INLINE |
| // expected-warning@-2 {{TRUE}} |
| #else |
| // expected-warning@-4 {{UNKNOWN}} |
| #endif |
| } |
| |
| void testException(std::exception e) { |
| // Notice that the argument is NOT passed by reference, so we can devirtualize. |
| const char *x = e.what(); |
| clang_analyzer_eval(x == 0); |
| #if INLINE |
| // expected-warning@-2 {{TRUE}} |
| #else |
| // expected-warning@-4 {{UNKNOWN}} |
| #endif |
| } |
| |
| void testList_pop_front(std::list<int> list) { |
| while(!list.empty()) |
| list.pop_front(); // no-warning |
| } |
| |
| void testBasicStringSuppression() { |
| std::basic_string<uint8_t> v; |
| v.push_back(1); // no-warning |
| } |
| |
| void testBasicStringSuppression_append() { |
| std::basic_string<char32_t> v; |
| v += 'c'; // no-warning |
| } |
| |
| void testBasicStringSuppression_assign(std::basic_string<char32_t> &v, |
| const std::basic_string<char32_t> &v2) { |
| v = v2; |
| } |