blob: 48a258588e4ca64099cb85e0b53137d52c9283e8 [file] [log] [blame]
Argyrios Kyrtzidisc4d2c902011-02-28 19:49:42 +00001// RUN: %clang_cc1 -analyze -analyzer-checker=core,core.experimental -analyzer-store=region -analyzer-constraints=range -verify %s
Ted Kremenekeea72a92011-07-28 23:07:36 +00002// XFAIL
Zhongxing Xuf45fbad2010-12-19 02:26:37 +00003
Jordy Rose5d553762010-06-04 01:14:56 +00004typedef typeof(sizeof(int)) size_t;
5void malloc (size_t);
Zhongxing Xubc37b8d2010-01-09 09:16:47 +00006
7void f1() {
Ted Kremenek892697d2010-12-16 07:46:53 +00008 int const &i = 3; // <--- **FIXME** This is currently not being modeled correctly.
Zhongxing Xubc37b8d2010-01-09 09:16:47 +00009 int b = i;
Zhongxing Xu3cd8bd42010-01-10 02:52:56 +000010
11 int *p = 0;
12
13 if (b != 3)
14 *p = 1; // no-warning
Zhongxing Xubc37b8d2010-01-09 09:16:47 +000015}
Zhongxing Xufc61d942010-06-03 06:23:18 +000016
17char* ptr();
18char& ref();
19
20// These next two tests just shouldn't crash.
21char t1 () {
22 ref() = 'c';
23 return '0';
24}
25
26// just a sanity test, the same behavior as t1()
27char t2 () {
28 *ptr() = 'c';
29 return '0';
30}
Jordy Rose5d553762010-06-04 01:14:56 +000031
32// Each of the tests below is repeated with pointers as well as references.
33// This is mostly a sanity check, but then again, both should work!
34char t3 () {
35 char& r = ref();
36 r = 'c'; // no-warning
37 if (r) return r;
38 return *(char*)0; // no-warning
39}
40
41char t4 () {
42 char* p = ptr();
43 *p = 'c'; // no-warning
44 if (*p) return *p;
45 return *(char*)0; // no-warning
46}
47
48char t5 (char& r) {
49 r = 'c'; // no-warning
50 if (r) return r;
51 return *(char*)0; // no-warning
52}
53
54char t6 (char* p) {
55 *p = 'c'; // no-warning
56 if (*p) return *p;
57 return *(char*)0; // no-warning
58}