array-struct-region.cpp revision 6ebea89be233eaba5e29de8cf3524ad150c860bb
16ebea89be233eaba5e29de8cf3524ad150c860bbJordan Rose// RUN: %clang_cc1 -analyze -analyzer-checker=core,alpha.core,debug.ExprInspection -verify -x c %s
26ebea89be233eaba5e29de8cf3524ad150c860bbJordan Rose// RUN: %clang_cc1 -analyze -analyzer-checker=core,alpha.core,debug.ExprInspection -verify -x c++ -analyzer-config c++-inlining=constructors %s
36ebea89be233eaba5e29de8cf3524ad150c860bbJordan Rose
46ebea89be233eaba5e29de8cf3524ad150c860bbJordan Rosevoid clang_analyzer_eval(int);
56ebea89be233eaba5e29de8cf3524ad150c860bbJordan Rose
66ebea89be233eaba5e29de8cf3524ad150c860bbJordan Rosestruct S {
76ebea89be233eaba5e29de8cf3524ad150c860bbJordan Rose  int field;
86ebea89be233eaba5e29de8cf3524ad150c860bbJordan Rose
96ebea89be233eaba5e29de8cf3524ad150c860bbJordan Rose#if __cplusplus
106ebea89be233eaba5e29de8cf3524ad150c860bbJordan Rose  const struct S *getThis() const { return this; }
116ebea89be233eaba5e29de8cf3524ad150c860bbJordan Rose#endif
126ebea89be233eaba5e29de8cf3524ad150c860bbJordan Rose};
136ebea89be233eaba5e29de8cf3524ad150c860bbJordan Rose
146ebea89be233eaba5e29de8cf3524ad150c860bbJordan Rosestruct S getS();
156ebea89be233eaba5e29de8cf3524ad150c860bbJordan Rose
166ebea89be233eaba5e29de8cf3524ad150c860bbJordan Rose
176ebea89be233eaba5e29de8cf3524ad150c860bbJordan Rosevoid testAssignment() {
186ebea89be233eaba5e29de8cf3524ad150c860bbJordan Rose  struct S s = getS();
196ebea89be233eaba5e29de8cf3524ad150c860bbJordan Rose
206ebea89be233eaba5e29de8cf3524ad150c860bbJordan Rose  if (s.field != 42) return;
216ebea89be233eaba5e29de8cf3524ad150c860bbJordan Rose  clang_analyzer_eval(s.field == 42); // expected-warning{{TRUE}}
226ebea89be233eaba5e29de8cf3524ad150c860bbJordan Rose
236ebea89be233eaba5e29de8cf3524ad150c860bbJordan Rose  s.field = 0;
246ebea89be233eaba5e29de8cf3524ad150c860bbJordan Rose  clang_analyzer_eval(s.field == 0); // expected-warning{{TRUE}}
256ebea89be233eaba5e29de8cf3524ad150c860bbJordan Rose
266ebea89be233eaba5e29de8cf3524ad150c860bbJordan Rose#if __cplusplus
276ebea89be233eaba5e29de8cf3524ad150c860bbJordan Rose  clang_analyzer_eval(s.getThis() == &s); // expected-warning{{TRUE}}
286ebea89be233eaba5e29de8cf3524ad150c860bbJordan Rose#endif
296ebea89be233eaba5e29de8cf3524ad150c860bbJordan Rose}
306ebea89be233eaba5e29de8cf3524ad150c860bbJordan Rose
316ebea89be233eaba5e29de8cf3524ad150c860bbJordan Rose
326ebea89be233eaba5e29de8cf3524ad150c860bbJordan Rosevoid testImmediateUse() {
336ebea89be233eaba5e29de8cf3524ad150c860bbJordan Rose  int x = getS().field;
346ebea89be233eaba5e29de8cf3524ad150c860bbJordan Rose
356ebea89be233eaba5e29de8cf3524ad150c860bbJordan Rose  if (x != 42) return;
366ebea89be233eaba5e29de8cf3524ad150c860bbJordan Rose  clang_analyzer_eval(x == 42); // expected-warning{{TRUE}}
376ebea89be233eaba5e29de8cf3524ad150c860bbJordan Rose
386ebea89be233eaba5e29de8cf3524ad150c860bbJordan Rose#if __cplusplus
396ebea89be233eaba5e29de8cf3524ad150c860bbJordan Rose  clang_analyzer_eval((void *)getS().getThis() == (void *)&x); // expected-warning{{FALSE}}
406ebea89be233eaba5e29de8cf3524ad150c860bbJordan Rose#endif
416ebea89be233eaba5e29de8cf3524ad150c860bbJordan Rose}
426ebea89be233eaba5e29de8cf3524ad150c860bbJordan Rose
436ebea89be233eaba5e29de8cf3524ad150c860bbJordan Roseint getConstrainedField(struct S s) {
446ebea89be233eaba5e29de8cf3524ad150c860bbJordan Rose  if (s.field != 42) return 42;
456ebea89be233eaba5e29de8cf3524ad150c860bbJordan Rose  return s.field;
466ebea89be233eaba5e29de8cf3524ad150c860bbJordan Rose}
476ebea89be233eaba5e29de8cf3524ad150c860bbJordan Rose
486ebea89be233eaba5e29de8cf3524ad150c860bbJordan Roseint getAssignedField(struct S s) {
496ebea89be233eaba5e29de8cf3524ad150c860bbJordan Rose  s.field = 42;
506ebea89be233eaba5e29de8cf3524ad150c860bbJordan Rose  return s.field;
516ebea89be233eaba5e29de8cf3524ad150c860bbJordan Rose}
526ebea89be233eaba5e29de8cf3524ad150c860bbJordan Rose
536ebea89be233eaba5e29de8cf3524ad150c860bbJordan Rosevoid testArgument() {
546ebea89be233eaba5e29de8cf3524ad150c860bbJordan Rose  clang_analyzer_eval(getConstrainedField(getS()) == 42); // expected-warning{{TRUE}}
556ebea89be233eaba5e29de8cf3524ad150c860bbJordan Rose  clang_analyzer_eval(getAssignedField(getS()) == 42); // expected-warning{{TRUE}}
566ebea89be233eaba5e29de8cf3524ad150c860bbJordan Rose}
576ebea89be233eaba5e29de8cf3524ad150c860bbJordan Rose
586ebea89be233eaba5e29de8cf3524ad150c860bbJordan Rose
596ebea89be233eaba5e29de8cf3524ad150c860bbJordan Rose//--------------------
606ebea89be233eaba5e29de8cf3524ad150c860bbJordan Rose// C++-only tests
616ebea89be233eaba5e29de8cf3524ad150c860bbJordan Rose//--------------------
626ebea89be233eaba5e29de8cf3524ad150c860bbJordan Rose
636ebea89be233eaba5e29de8cf3524ad150c860bbJordan Rose#if __cplusplus
646ebea89be233eaba5e29de8cf3524ad150c860bbJordan Rosevoid testReferenceAssignment() {
656ebea89be233eaba5e29de8cf3524ad150c860bbJordan Rose  const S &s = getS();
666ebea89be233eaba5e29de8cf3524ad150c860bbJordan Rose
676ebea89be233eaba5e29de8cf3524ad150c860bbJordan Rose  if (s.field != 42) return;
686ebea89be233eaba5e29de8cf3524ad150c860bbJordan Rose  clang_analyzer_eval(s.field == 42); // expected-warning{{TRUE}}
696ebea89be233eaba5e29de8cf3524ad150c860bbJordan Rose
706ebea89be233eaba5e29de8cf3524ad150c860bbJordan Rose  clang_analyzer_eval(s.getThis() == &s); // expected-warning{{TRUE}}
716ebea89be233eaba5e29de8cf3524ad150c860bbJordan Rose}
726ebea89be233eaba5e29de8cf3524ad150c860bbJordan Rose
736ebea89be233eaba5e29de8cf3524ad150c860bbJordan Rose
746ebea89be233eaba5e29de8cf3524ad150c860bbJordan Roseint getConstrainedFieldRef(const S &s) {
756ebea89be233eaba5e29de8cf3524ad150c860bbJordan Rose  if (s.field != 42) return 42;
766ebea89be233eaba5e29de8cf3524ad150c860bbJordan Rose  return s.field;
776ebea89be233eaba5e29de8cf3524ad150c860bbJordan Rose}
786ebea89be233eaba5e29de8cf3524ad150c860bbJordan Rose
796ebea89be233eaba5e29de8cf3524ad150c860bbJordan Rosebool checkThis(const S &s) {
806ebea89be233eaba5e29de8cf3524ad150c860bbJordan Rose  return s.getThis() == &s;
816ebea89be233eaba5e29de8cf3524ad150c860bbJordan Rose}
826ebea89be233eaba5e29de8cf3524ad150c860bbJordan Rose
836ebea89be233eaba5e29de8cf3524ad150c860bbJordan Rosevoid testReferenceArgument() {
846ebea89be233eaba5e29de8cf3524ad150c860bbJordan Rose  clang_analyzer_eval(getConstrainedFieldRef(getS()) == 42); // expected-warning{{TRUE}}
856ebea89be233eaba5e29de8cf3524ad150c860bbJordan Rose  clang_analyzer_eval(checkThis(getS())); // expected-warning{{TRUE}}
866ebea89be233eaba5e29de8cf3524ad150c860bbJordan Rose}
876ebea89be233eaba5e29de8cf3524ad150c860bbJordan Rose#endif
88