| // RUN: %clang_analyze_cc1 -analyzer-checker=core,unix.Malloc,debug.ExprInspection -verify %s | |
| // REQUIRES: LP64 | |
| void clang_analyzer_eval(bool); | |
| int f1(char *dst) { | |
| char *p = dst + 4; | |
| char *q = dst + 3; | |
| return !(q >= p); | |
| } | |
| long f2(char *c) { | |
| return long(c) & 1; | |
| } | |
| bool f3() { | |
| return !false; | |
| } | |
| void *f4(int* w) { | |
| return reinterpret_cast<void*&>(w); | |
| } | |
| namespace { | |
| struct A { }; | |
| struct B { | |
| operator A() { return A(); } | |
| }; | |
| A f(char *dst) { | |
| B b; | |
| return b; | |
| } | |
| } | |
| namespace { | |
| struct S { | |
| void *p; | |
| }; | |
| void *f(S* w) { | |
| return &reinterpret_cast<void*&>(*w); | |
| } | |
| } | |
| namespace { | |
| struct C { | |
| void *p; | |
| static void f(); | |
| }; | |
| void C::f() { } | |
| } | |
| void vla(int n) { | |
| int nums[n]; | |
| nums[0] = 1; | |
| clang_analyzer_eval(nums[0] == 1); // expected-warning{{TRUE}} | |
| // This used to fail with MallocChecker on, and /only/ in C++ mode. | |
| // This struct is POD, though, so it should be fine to put it in a VLA. | |
| struct { int x; } structs[n]; | |
| structs[0].x = 1; | |
| clang_analyzer_eval(structs[0].x == 1); // expected-warning{{TRUE}} | |
| } | |
| void useIntArray(int []); | |
| void testIntArrayLiteral() { | |
| useIntArray((int []){ 1, 2, 3 }); | |
| } | |