OSDN Git Service

* lib/target-supports.exp (check_effective_target_int32plus): New.
[pf3gnuchains/gcc-fork.git] / gcc / testsuite / gcc.dg / pr18241-2.c
1 /* { dg-do run } */
2 /* memset doesn't take unsigned long */
3 /* { dg-xfail-if "" { "m32c-*-*" } { "*" } { "" } } */
4 /* { dg-options "-std=gnu99 -Wall -Wextra -O1" } */ 
5
6 extern void *memset (void*, int, unsigned long);
7 extern void abort (void);
8
9 struct radix_tree_root {
10         unsigned int height;
11         struct radix_tree_node *rnode;
12 };
13
14 struct radix_tree_node {
15         unsigned int count;
16         void *slots[64];
17         unsigned long tags[2];
18 };
19
20 struct radix_tree_path {
21         struct radix_tree_node *node, **slot;
22         int offset;
23 };
24
25 void radix_tree_tag_clear(struct radix_tree_root *root, unsigned long index)
26 {
27         struct radix_tree_path path[7], *pathp = path;
28         unsigned int height, shift;
29         volatile unsigned long *addr;
30         
31         height = root->height;
32         
33         shift = (height - 1) * 6;
34         path[0].slot = &root->rnode;
35         
36         while (height > 0) {
37                 int offset;
38                 
39                 offset = (index >> shift) & (64-1);
40                 pathp[1].offset = offset;
41                 pathp[1].node = *pathp[0].slot;
42                 pathp[1].slot = (struct radix_tree_node **)
43                         (pathp[1].node->slots + offset);
44                 pathp++;
45                 shift -= 6;
46                 height--;
47         }
48         
49         addr = &(pathp->node->tags[0]) + 1;
50         *addr = 574;
51 }
52
53 struct radix_tree_root r;
54 struct radix_tree_node node;
55
56 int main ()
57 {
58         r.height = 1;
59         r.rnode = &node;
60         
61         memset (&node, 0, sizeof (node));
62         
63         node.count = 1;
64         
65         radix_tree_tag_clear (&r, 13);
66         return 0;
67 }