| // RUN: %clang_analyze_cc1 -std=c++14 -analyzer-checker=core,debug.ExprInspection -verify %s |
| |
| void clang_analyzer_eval(bool); |
| |
| bool PR14634(int x) { |
| double y = (double)x; |
| return !y; |
| } |
| |
| bool PR14634_implicit(int x) { |
| double y = (double)x; |
| return y; |
| } |
| |
| void intAsBoolAsSwitchCondition(int c) { |
| switch ((bool)c) { // expected-warning {{switch condition has boolean value}} |
| case 0: |
| break; |
| } |
| |
| switch ((int)(bool)c) { // no-warning |
| case 0: |
| break; |
| } |
| } |
| |
| int *&castToIntPtrLValueRef(char *p) { |
| return (int *&)*(int *)p; |
| } |
| bool testCastToIntPtrLValueRef(char *p, int *s) { |
| return castToIntPtrLValueRef(p) != s; // no-crash |
| } |
| |
| int *&&castToIntPtrRValueRef(char *p) { |
| return (int *&&)*(int *)p; |
| } |
| bool testCastToIntPtrRValueRef(char *p, int *s) { |
| return castToIntPtrRValueRef(p) != s; // no-crash |
| } |
| |
| bool retrievePointerFromBoolean(int *p) { |
| bool q; |
| *reinterpret_cast<int **>(&q) = p; |
| return q; |
| } |
| |
| namespace base_to_derived { |
| struct A {}; |
| struct B : public A{}; |
| |
| void foo(A* a) { |
| B* b = (B* ) a; |
| A* a2 = (A *) b; |
| clang_analyzer_eval(a2 == a); // expected-warning{{TRUE}} |
| } |
| } |
| |
| namespace base_to_derived_double_inheritance { |
| struct A { |
| int x; |
| }; |
| struct B { |
| int y; |
| }; |
| struct C : A, B {}; |
| |
| void foo(B *b) { |
| C *c = (C *)b; |
| b->y = 1; |
| clang_analyzer_eval(c->x); // expected-warning{{UNKNOWN}} |
| clang_analyzer_eval(c->y); // expected-warning{{TRUE}} |
| } |
| } // namespace base_to_derived_double_inheritance |
| |
| namespace base_to_derived_opaque_class { |
| class NotInt { |
| public: |
| operator int() { return !x; } // no-crash |
| int x; |
| }; |
| |
| typedef struct Opaque *OpaqueRef; |
| typedef void *VeryOpaqueRef; |
| |
| class Transparent { |
| public: |
| int getNotInt() { return NI; } |
| NotInt NI; |
| }; |
| |
| class SubTransparent : public Transparent {}; |
| |
| SubTransparent *castToDerived(Transparent *TRef) { |
| return (SubTransparent *)TRef; |
| } |
| |
| void foo(OpaqueRef ORef) { |
| castToDerived(reinterpret_cast<Transparent *>(ORef))->getNotInt(); |
| } |
| |
| void foo(VeryOpaqueRef ORef) { |
| castToDerived(reinterpret_cast<Transparent *>(ORef))->getNotInt(); |
| } |
| } // namespace base_to_derived_opaque_class |
| |
| namespace bool_to_nullptr { |
| struct S { |
| int *a[1]; |
| bool b; |
| }; |
| void foo(S s) { |
| s.b = true; |
| for (int i = 0; i < 2; ++i) |
| (void)(s.a[i] != nullptr); // no-crash |
| } |
| } // namespace bool_to_nullptr |