[clang] Handle __declspec() attributes in using
[llvm-project.git] / clang / test / Analysis / casts.cpp
blobdbf628e63319f93e62a6bac48c39c8571cfd5934
1 // RUN: %clang_analyze_cc1 -std=c++14 -analyzer-checker=core,debug.ExprInspection -verify %s
3 void clang_analyzer_eval(bool);
5 bool PR14634(int x) {
6 double y = (double)x;
7 return !y;
10 bool PR14634_implicit(int x) {
11 double y = (double)x;
12 return y;
15 void intAsBoolAsSwitchCondition(int c) {
16 switch ((bool)c) { // expected-warning {{switch condition has boolean value}}
17 case 0:
18 break;
21 switch ((int)(bool)c) { // no-warning
22 case 0:
23 break;
27 int *&castToIntPtrLValueRef(char *p) {
28 return (int *&)*(int *)p;
30 bool testCastToIntPtrLValueRef(char *p, int *s) {
31 return castToIntPtrLValueRef(p) != s; // no-crash
34 int *&&castToIntPtrRValueRef(char *p) {
35 return (int *&&)*(int *)p;
37 bool testCastToIntPtrRValueRef(char *p, int *s) {
38 return castToIntPtrRValueRef(p) != s; // no-crash
41 bool retrievePointerFromBoolean(int *p) {
42 bool q;
43 *reinterpret_cast<int **>(&q) = p;
44 return q;
47 namespace base_to_derived {
48 struct A {};
49 struct B : public A{};
51 void foo(A* a) {
52 B* b = (B* ) a;
53 A* a2 = (A *) b;
54 clang_analyzer_eval(a2 == a); // expected-warning{{TRUE}}
58 namespace base_to_derived_double_inheritance {
59 struct A {
60 int x;
62 struct B {
63 int y;
65 struct C : A, B {};
67 void foo(B *b) {
68 C *c = (C *)b;
69 b->y = 1;
70 clang_analyzer_eval(c->x); // expected-warning{{UNKNOWN}}
71 clang_analyzer_eval(c->y); // expected-warning{{TRUE}}
73 } // namespace base_to_derived_double_inheritance
75 namespace base_to_derived_opaque_class {
76 class NotInt {
77 public:
78 operator int() { return !x; } // no-crash
79 int x;
82 typedef struct Opaque *OpaqueRef;
83 typedef void *VeryOpaqueRef;
85 class Transparent {
86 public:
87 int getNotInt() { return NI; }
88 NotInt NI;
91 class SubTransparent : public Transparent {};
93 SubTransparent *castToDerived(Transparent *TRef) {
94 return (SubTransparent *)TRef;
97 void foo(OpaqueRef ORef) {
98 castToDerived(reinterpret_cast<Transparent *>(ORef))->getNotInt();
101 void foo(VeryOpaqueRef ORef) {
102 castToDerived(reinterpret_cast<Transparent *>(ORef))->getNotInt();
104 } // namespace base_to_derived_opaque_class
106 namespace bool_to_nullptr {
107 struct S {
108 int *a[1];
109 bool b;
111 void foo(S s) {
112 s.b = true;
113 for (int i = 0; i < 2; ++i)
114 (void)(s.a[i] != nullptr); // no-crash
116 } // namespace bool_to_nullptr