// RUN: %clang_analyze_cc1 -std=c++14 -analyzer-checker=core,debug.ExprInspection -analyzer-store=region -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(&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(ORef))->getNotInt(); } void foo(VeryOpaqueRef ORef) { castToDerived(reinterpret_cast(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