1 // RUN: %clang_analyze_cc1 -analyzer-checker=core,debug.ExprInspection -verify %s
3 void clang_analyzer_eval(bool);
25 struct MutDerived : MutBase {
33 struct PDerived : PBase {
49 void checkThatConstMethodWithoutDefinitionDoesNotInvalidateObject() {
53 clang_analyzer_eval(t.x == 3); // expected-warning{{TRUE}}
54 // Test non-const does invalidate
56 clang_analyzer_eval(t.x); // expected-warning{{UNKNOWN}}
59 void checkThatConstMethodDoesInvalidateMutableFields() {
63 clang_analyzer_eval(t.mut); // expected-warning{{UNKNOWN}}
66 void checkThatConstMethodDoesInvalidatePointedAtMemory() {
71 clang_analyzer_eval(x); // expected-warning{{UNKNOWN}}
72 clang_analyzer_eval(t.p == &x); // expected-warning{{TRUE}}
75 void checkThatConstMethodDoesInvalidateInheritedMutableFields() {
79 clang_analyzer_eval(t.b_mut); // expected-warning{{UNKNOWN}}
82 void checkThatConstMethodDoesInvalidateInheritedPointedAtMemory() {
87 clang_analyzer_eval(x); // expected-warning{{UNKNOWN}}
88 clang_analyzer_eval(t.p == &x); // expected-warning{{TRUE}}
91 void checkThatConstMethodDoesInvalidateContainedPointedAtMemory() {
97 clang_analyzer_eval(x); // expected-warning{{UNKNOWN}}
98 clang_analyzer_eval(t.x == 2); // expected-warning{{TRUE}}
99 clang_analyzer_eval(t.in.p == &x); // expected-warning{{TRUE}}
102 void checkThatContainedConstMethodDoesNotInvalidateObjects() {
107 clang_analyzer_eval(t.x == 1); // expected-warning{{TRUE}}
108 clang_analyzer_eval(t.in.x == 2); // expected-warning{{TRUE}}
111 // --- Versions of the above tests where the const method is inherited --- //
117 struct D1 : public B1 {
121 struct D2 : public B1 {
125 struct D3 : public B1 {
129 struct DInner : public B1 {
134 struct DOuter : public B1 {
139 void checkThatInheritedConstMethodDoesNotInvalidateObject() {
143 clang_analyzer_eval(t.x == 1); // expected-warning{{TRUE}}
146 void checkThatInheritedConstMethodDoesInvalidateMutableFields() {
150 clang_analyzer_eval(t.mut); // expected-warning{{UNKNOWN}}
153 void checkThatInheritedConstMethodDoesInvalidatePointedAtMemory() {
158 clang_analyzer_eval(x); // expected-warning{{UNKNOWN}}
159 clang_analyzer_eval(t.p == &x); // expected-warning{{TRUE}}
162 void checkThatInheritedConstMethodDoesInvalidateContainedPointedAtMemory() {
169 clang_analyzer_eval(x); // expected-warning{{UNKNOWN}}
170 clang_analyzer_eval(t.x == 2); // expected-warning{{TRUE}}
171 clang_analyzer_eval(t.in.x == 3); // expected-warning{{TRUE}}
172 clang_analyzer_eval(t.in.p == &x); // expected-warning{{TRUE}}
175 void checkThatInheritedContainedConstMethodDoesNotInvalidateObjects() {
180 clang_analyzer_eval(t.x == 1); // expected-warning{{TRUE}}
181 clang_analyzer_eval(t.in.x == 2); // expected-warning{{TRUE}}
184 // --- PR21606 --- //
187 void g(const int *i) const;
195 *i = 42; // no-warning
207 // --- PR25392 --- //
209 struct HasConstMemberFunction {
211 void constMemberFunction() const;
214 HasConstMemberFunction hasNoReturn() { } // expected-warning {{control reaches end of non-void function}}
216 void testUnknownWithConstMemberFunction() {
217 hasNoReturn().constMemberFunction();
220 void testNonRegionLocWithConstMemberFunction() {
221 (*((HasConstMemberFunction *)(&&label))).constMemberFunction();
227 // When there is a circular reference to an object and a const method is called
228 // the object is not invalidated because TK_PreserveContents has already been
232 struct InnerWithRef {
242 void checkThatConstMethodCallDoesInvalidateObjectForCircularReferences() {
247 // FIXME: Should be UNKNOWN.
248 clang_analyzer_eval(t.x); // expected-warning{{TRUE}}