1 // RUN: %clang_cc1 -analyze -std=c++11 -analyzer-checker=core,unix.Malloc,debug.ExprInspection -analyzer-config c++-inlining=destructors -analyzer-config c++-container-inlining=false -verify %s
2 // RUN: %clang_cc1 -analyze -std=c++11 -analyzer-checker=core,unix.Malloc,debug.ExprInspection -analyzer-config c++-inlining=destructors -analyzer-config c++-container-inlining=true -DINLINE=1 -verify %s
6 void clang_analyzer_eval(bool);
7 void clang_analyzer_checkInlined(bool);
10 #include "containers.cpp"
16 clang_analyzer_eval(set.isEmpty());
18 // expected-warning@-2 {{TRUE}}
20 // expected-warning@-4 {{UNKNOWN}}
23 clang_analyzer_eval(set.raw_begin() == set.raw_end());
25 // expected-warning@-2 {{TRUE}}
27 // expected-warning@-4 {{UNKNOWN}}
30 clang_analyzer_eval(set.begin().impl == set.end().impl);
32 // expected-warning@-2 {{TRUE}}
34 // expected-warning@-4 {{UNKNOWN}}
38 void testSubclass(MySetSubclass &sub) {
39 sub.useIterator(sub.begin());
44 void testWrappers(BeginOnlySet &w1, IteratorStructOnlySet &w2,
45 IteratorTypedefOnlySet &w3, IteratorUsingOnlySet &w4) {
47 IteratorStructOnlySet local2;
48 IteratorTypedefOnlySet local3;
49 IteratorUsingOnlySet local4;
51 clang_analyzer_eval(w1.begin().impl.impl == w1.begin().impl.impl);
53 // expected-warning@-2 {{TRUE}}
55 // expected-warning@-4 {{UNKNOWN}}
58 clang_analyzer_eval(w2.start().impl == w2.start().impl);
60 // expected-warning@-2 {{TRUE}}
62 // expected-warning@-4 {{UNKNOWN}}
65 clang_analyzer_eval(w3.start().impl == w3.start().impl);
67 // expected-warning@-2 {{TRUE}}
69 // expected-warning@-4 {{UNKNOWN}}
72 clang_analyzer_eval(w4.start().impl == w4.start().impl);
74 // expected-warning@-2 {{TRUE}}
76 // expected-warning@-4 {{UNKNOWN}}
83 #include "../Inputs/system-header-simulator-cxx.h"
89 MySet() : storage(0), size(0) {
90 clang_analyzer_checkInlined(true);
92 // expected-warning@-2 {{TRUE}}
96 MySet(unsigned n) : storage(new int[n]), size(n) {
97 clang_analyzer_checkInlined(true);
99 // expected-warning@-2 {{TRUE}}
103 ~MySet() { delete[] storage; }
106 clang_analyzer_checkInlined(true); // expected-warning {{TRUE}}
113 iterator(int *p) : impl(p) {}
117 clang_analyzer_checkInlined(true); // expected-warning {{TRUE}}
118 return iterator(storage);
122 clang_analyzer_checkInlined(true); // expected-warning {{TRUE}}
123 return iterator(storage+size);
126 typedef int *raw_iterator;
128 raw_iterator raw_begin() {
129 clang_analyzer_checkInlined(true); // expected-warning {{TRUE}}
132 raw_iterator raw_end() {
133 clang_analyzer_checkInlined(true); // expected-warning {{TRUE}}
134 return storage + size;
138 class MySetSubclass : public MySet {
141 clang_analyzer_checkInlined(true);
143 // expected-warning@-2 {{TRUE}}
147 void useIterator(iterator i) {
148 clang_analyzer_checkInlined(true); // expected-warning {{TRUE}}
156 MySet::iterator impl;
157 typedef std::forward_iterator_tag iterator_category;
159 IterImpl(MySet::iterator i) : impl(i) {
160 clang_analyzer_checkInlined(true);
162 // expected-warning@-2 {{TRUE}}
168 clang_analyzer_checkInlined(true);
170 // expected-warning@-2 {{TRUE}}
174 typedef IterImpl wrapped_iterator;
176 wrapped_iterator begin() {
177 clang_analyzer_checkInlined(true); // expected-warning {{TRUE}}
178 return IterImpl(impl.begin());
182 class IteratorTypedefOnlySet {
186 IteratorTypedefOnlySet() {
187 clang_analyzer_checkInlined(true);
189 // expected-warning@-2 {{TRUE}}
193 typedef MySet::iterator iterator;
196 clang_analyzer_checkInlined(true); // expected-warning {{TRUE}}
201 class IteratorUsingOnlySet {
205 IteratorUsingOnlySet() {
206 clang_analyzer_checkInlined(true);
208 // expected-warning@-2 {{TRUE}}
212 using iterator = MySet::iterator;
215 clang_analyzer_checkInlined(true); // expected-warning {{TRUE}}
220 class IteratorStructOnlySet {
224 IteratorStructOnlySet() {
225 clang_analyzer_checkInlined(true);
227 // expected-warning@-2 {{TRUE}}
236 clang_analyzer_checkInlined(true); // expected-warning {{TRUE}}
237 return iterator{impl.begin().impl};