1 
2 string tls_var = "tls_string";
3 
4 __gshared string data_var = "data_string";
5 
6 __gshared string bss_var;
7 
8 struct Range
9 {
10     const(void)* bot;
11     const(void)* top; // consider inclusive
12 
addPtrRange13     void addPtr(const(void)* p)
14     {
15         if (!bot || p < bot)
16             bot = p;
17         if (!top || p > top)
18             top = p;
19     }
20 
intersectRange21     bool intersect(Range other)
22     {
23         return (bot <= other.top && top >= other.bot);
24     }
25 }
26 
testStrings()27 void testStrings()
28 {
29     // check that the strings don't overlap with the variables
30     Range tls;
31     Range data;
32     Range bss;
33     Range cdata;
34 
35     static string local_tls_var = "tls_string";
36     static __gshared string local_data_var = "data_string";
37     static __gshared string local_bss_var;
38 
39     tls.addPtr(&tls_var);
40     tls.addPtr(&local_tls_var);
41 
42     data.addPtr(&data_var);
43     data.addPtr(&local_data_var);
44 
45     bss.addPtr(&bss_var);
46     bss.addPtr(&local_bss_var);
47 
48     cdata.addPtr(tls_var.ptr);
49     cdata.addPtr(local_tls_var.ptr);
50     cdata.addPtr(data_var.ptr);
51     cdata.addPtr(local_data_var.ptr);
52 
53     assert(!cdata.intersect(tls),  "overlap with tls");
54     assert(!cdata.intersect(data), "overlap with data");
55     assert(!cdata.intersect(bss),  "overlap with bss");
56 }
57 
main()58 void main()
59 {
60     testStrings();
61 }
62