array-struct-region.cpp [plain text]
void clang_analyzer_eval(int);
struct S {
int field;
#if __cplusplus
const struct S *getThis() const { return this; }
const struct S *operator +() const { return this; }
bool check() const { return this == this; }
bool operator !() const { return this != this; }
int operator *() const { return field; }
#endif
};
#if __cplusplus
const struct S *operator -(const struct S &s) { return &s; }
bool operator ~(const struct S &s) { return &s != &s; }
#endif
#ifdef INLINE
struct S getS() {
struct S s = { 42 };
return s;
}
#else
struct S getS();
#endif
void testAssignment() {
struct S s = getS();
if (s.field != 42) return;
clang_analyzer_eval(s.field == 42);
s.field = 0;
clang_analyzer_eval(s.field == 0);
#if __cplusplus
clang_analyzer_eval(s.getThis() == &s); clang_analyzer_eval(+s == &s); clang_analyzer_eval(-s == &s);
clang_analyzer_eval(s.check()); clang_analyzer_eval(!s); clang_analyzer_eval(~s);
clang_analyzer_eval(*s == 0); #endif
}
void testImmediateUse() {
int x = getS().field;
if (x != 42) return;
clang_analyzer_eval(x == 42);
#if __cplusplus
clang_analyzer_eval((void *)getS().getThis() == (void *)&x); clang_analyzer_eval((void *)+getS() == (void *)&x); clang_analyzer_eval((void *)-getS() == (void *)&x);
clang_analyzer_eval(getS().check()); clang_analyzer_eval(!getS()); clang_analyzer_eval(~getS()); #endif
}
int getConstrainedField(struct S s) {
if (s.field != 42) return 42;
return s.field;
}
int getAssignedField(struct S s) {
s.field = 42;
return s.field;
}
void testArgument() {
clang_analyzer_eval(getConstrainedField(getS()) == 42); clang_analyzer_eval(getAssignedField(getS()) == 42); }
void testImmediateUseParens() {
int x = ((getS())).field;
if (x != 42) return;
clang_analyzer_eval(x == 42);
clang_analyzer_eval(getConstrainedField(((getS()))) == 42); clang_analyzer_eval(getAssignedField(((getS()))) == 42);
#if __cplusplus
clang_analyzer_eval(((getS())).check()); clang_analyzer_eval(!((getS()))); clang_analyzer_eval(~((getS()))); #endif
}
#if __cplusplus
void testReferenceAssignment() {
const S &s = getS();
if (s.field != 42) return;
clang_analyzer_eval(s.field == 42);
clang_analyzer_eval(s.getThis() == &s); clang_analyzer_eval(+s == &s);
clang_analyzer_eval(s.check()); clang_analyzer_eval(!s); clang_analyzer_eval(~s);
clang_analyzer_eval(*s == 42); }
int getConstrainedFieldRef(const S &s) {
if (s.field != 42) return 42;
return s.field;
}
bool checkThis(const S &s) {
return s.getThis() == &s;
}
bool checkThisOp(const S &s) {
return +s == &s;
}
bool checkThisStaticOp(const S &s) {
return -s == &s;
}
void testReferenceArgument() {
clang_analyzer_eval(getConstrainedFieldRef(getS()) == 42); clang_analyzer_eval(checkThis(getS())); clang_analyzer_eval(checkThisOp(getS())); clang_analyzer_eval(checkThisStaticOp(getS())); }
int getConstrainedFieldOp(S s) {
if (*s != 42) return 42;
return *s;
}
int getConstrainedFieldRefOp(const S &s) {
if (*s != 42) return 42;
return *s;
}
void testImmediateUseOp() {
int x = *getS();
if (x != 42) return;
clang_analyzer_eval(x == 42);
clang_analyzer_eval(getConstrainedFieldOp(getS()) == 42); clang_analyzer_eval(getConstrainedFieldRefOp(getS()) == 42); }
#endif