274 lines · cpp
1// RUN: %clang_analyze_cc1 -std=c++11 -analyzer-checker=core,unix.Malloc,debug.ExprInspection -analyzer-config c++-inlining=destructors -analyzer-config c++-container-inlining=false -verify -analyzer-config eagerly-assume=false %s2// RUN: %clang_analyze_cc1 -std=c++11 -analyzer-checker=core,unix.Malloc,debug.ExprInspection -analyzer-config c++-inlining=destructors -analyzer-config c++-container-inlining=true -DINLINE=1 -verify -analyzer-config eagerly-assume=false %s3// RUN: %clang_analyze_cc1 -std=c++11 -analyzer-checker=core,unix.Malloc,debug.ExprInspection -analyzer-config c++-inlining=destructors -analyzer-config c++-container-inlining=false -DTEST_INLINABLE_ALLOCATORS -verify -analyzer-config eagerly-assume=false %s4// RUN: %clang_analyze_cc1 -std=c++11 -analyzer-checker=core,unix.Malloc,debug.ExprInspection -analyzer-config c++-inlining=destructors -analyzer-config c++-container-inlining=true -DTEST_INLINABLE_ALLOCATORS -DINLINE=1 -verify -analyzer-config eagerly-assume=false %s5 6#ifndef HEADER7 8void clang_analyzer_eval(bool);9void clang_analyzer_checkInlined(bool);10 11#define HEADER12#include "containers.cpp"13#undef HEADER14 15void test() {16 MySet set(0);17 18 clang_analyzer_eval(set.isEmpty());19#if INLINE20 // expected-warning@-2 {{TRUE}}21#else22 // expected-warning@-4 {{UNKNOWN}}23#endif24 25 clang_analyzer_eval(set.raw_begin() == set.raw_end());26#if INLINE27 // expected-warning@-2 {{TRUE}}28#else29 // expected-warning@-4 {{UNKNOWN}}30#endif31 32 clang_analyzer_eval(set.begin().impl == set.end().impl);33#if INLINE34 // expected-warning@-2 {{TRUE}}35#else36 // expected-warning@-4 {{UNKNOWN}}37#endif38}39 40void testSubclass(MySetSubclass &sub) {41 sub.useIterator(sub.begin());42 43 MySetSubclass local;44}45 46void testWrappers(BeginOnlySet &w1, IteratorStructOnlySet &w2,47 IteratorTypedefOnlySet &w3, IteratorUsingOnlySet &w4) {48 BeginOnlySet local1;49 IteratorStructOnlySet local2;50 IteratorTypedefOnlySet local3;51 IteratorUsingOnlySet local4;52 53 clang_analyzer_eval(w1.begin().impl.impl == w1.begin().impl.impl);54#if INLINE55 // expected-warning@-2 {{TRUE}}56#else57 // expected-warning@-4 {{UNKNOWN}}58#endif59 60 clang_analyzer_eval(w2.start().impl == w2.start().impl);61#if INLINE62 // expected-warning@-2 {{TRUE}}63#else64 // expected-warning@-4 {{UNKNOWN}}65#endif66 67 clang_analyzer_eval(w3.start().impl == w3.start().impl);68#if INLINE69 // expected-warning@-2 {{TRUE}}70#else71 // expected-warning@-4 {{UNKNOWN}}72#endif73 74 clang_analyzer_eval(w4.start().impl == w4.start().impl);75#if INLINE76 // expected-warning@-2 {{TRUE}}77#else78 // expected-warning@-4 {{UNKNOWN}}79#endif80}81 82 83#else // HEADER84 85#include "../Inputs/system-header-simulator-cxx.h"86 87class MySet {88 int *storage;89 unsigned size;90public:91 MySet() : storage(0), size(0) {92 clang_analyzer_checkInlined(true);93#if INLINE94 // expected-warning@-2 {{TRUE}}95#endif96 }97 98 MySet(unsigned n) : storage(new int[n]), size(n) {99 clang_analyzer_checkInlined(true);100#if INLINE101 // expected-warning@-2 {{TRUE}}102#endif103 }104 105 ~MySet() { delete[] storage; }106 107 bool isEmpty() {108 clang_analyzer_checkInlined(true);109 #if INLINE110 // expected-warning@-2 {{TRUE}}111 #endif112 return size == 0;113 }114 115 struct iterator {116 int *impl;117 118 iterator(int *p) : impl(p) {}119 };120 121 iterator begin() {122 clang_analyzer_checkInlined(true);123 #if INLINE124 // expected-warning@-2 {{TRUE}}125 #endif126 return iterator(storage);127 }128 129 iterator end() {130 clang_analyzer_checkInlined(true);131 #if INLINE132 // expected-warning@-2 {{TRUE}}133 #endif134 return iterator(storage+size);135 }136 137 typedef int *raw_iterator;138 139 raw_iterator raw_begin() {140 clang_analyzer_checkInlined(true);141 #if INLINE142 // expected-warning@-2 {{TRUE}}143 #endif144 return storage;145 }146 raw_iterator raw_end() {147 clang_analyzer_checkInlined(true);148 #if INLINE149 // expected-warning@-2 {{TRUE}}150 #endif151 return storage + size;152 }153};154 155class MySetSubclass : public MySet {156public:157 MySetSubclass() {158 clang_analyzer_checkInlined(true);159#if INLINE160 // expected-warning@-2 {{TRUE}}161#endif162 }163 164 void useIterator(iterator i) {165 clang_analyzer_checkInlined(true);166 #if INLINE167 // expected-warning@-2 {{TRUE}}168 #endif169 }170};171 172class BeginOnlySet {173 MySet impl;174public:175 struct IterImpl {176 MySet::iterator impl;177 typedef std::forward_iterator_tag iterator_category;178 179 IterImpl(MySet::iterator i) : impl(i) {180 clang_analyzer_checkInlined(true);181#if INLINE182 // expected-warning@-2 {{TRUE}}183#endif184 }185 };186 187 BeginOnlySet() {188 clang_analyzer_checkInlined(true);189#if INLINE190 // expected-warning@-2 {{TRUE}}191#endif192 }193 194 typedef IterImpl wrapped_iterator;195 196 wrapped_iterator begin() {197 clang_analyzer_checkInlined(true);198 #if INLINE199 // expected-warning@-2 {{TRUE}}200 #endif201 return IterImpl(impl.begin());202 }203};204 205class IteratorTypedefOnlySet {206 MySet impl;207public:208 209 IteratorTypedefOnlySet() {210 clang_analyzer_checkInlined(true);211#if INLINE212 // expected-warning@-2 {{TRUE}}213#endif214 }215 216 typedef MySet::iterator iterator;217 218 iterator start() {219 clang_analyzer_checkInlined(true);220#if INLINE221 // expected-warning@-2 {{TRUE}}222#endif223 return impl.begin();224 }225};226 227class IteratorUsingOnlySet {228 MySet impl;229public:230 231 IteratorUsingOnlySet() {232 clang_analyzer_checkInlined(true);233#if INLINE234 // expected-warning@-2 {{TRUE}}235#endif236 }237 238 using iterator = MySet::iterator;239 240 iterator start() {241 clang_analyzer_checkInlined(true);242 #if INLINE243 // expected-warning@-2 {{TRUE}}244 #endif245 return impl.begin();246 }247};248 249class IteratorStructOnlySet {250 MySet impl;251public:252 253 IteratorStructOnlySet() {254 clang_analyzer_checkInlined(true);255#if INLINE256 // expected-warning@-2 {{TRUE}}257#endif258 }259 260 struct iterator {261 int *impl;262 };263 264 iterator start() {265 clang_analyzer_checkInlined(true);266 #if INLINE267 // expected-warning@-2 {{TRUE}}268 #endif269 return iterator{impl.begin().impl};270 }271};272 273#endif // HEADER274