1 /* { dg-do compile } */
2 /* { dg-options "-O2 -fdump-tree-forwprop1 -fno-short-enums" } */
3 
4 union tree_node;
5 typedef union tree_node *tree;
6 enum tree_code
7 {
8   MAX_TREE_CODES
9 };
10 extern unsigned char tree_contains_struct[MAX_TREE_CODES][64];
11 struct tree_base
12 {
13   __extension__ enum tree_code code:16;
14   unsigned public_flag:1;
15 };
16 enum tree_node_structure_enum
17 {
18   TS_DECL_WITH_VIS,
19 };
20 struct tree_decl_with_vis
21 {
22   unsigned comdat_flag:1;
23 };
24 union tree_node
25 {
26   struct tree_base base;
27   struct tree_decl_with_vis decl_with_vis;
28 };
29 struct varpool_node
30 {
31   tree decl;
32   struct varpool_node *next_needed, *prev_needed;
33   unsigned externally_visible:1;
34 };
35 extern struct varpool_node *varpool_nodes_queue;
36 struct pointer_set_t;
37 struct pointer_set_t *pointer_set_create (void);
38 __inline__ static unsigned char
varpool_externally_visible_p(struct varpool_node * vnode,unsigned char aliased)39 varpool_externally_visible_p (struct varpool_node *vnode,
40 			      unsigned char aliased)
41 {
42   struct varpool_node *alias;
43   if (!(( { __typeof (vnode->decl) const __t = (vnode->decl); __t;})->decl_with_vis.comdat_flag)
44       && !((vnode->decl)->base.public_flag))
45     return 0;
46   if (aliased)
47     return 1;
48   return 0;
49 }
50 
51 unsigned char pointer_set_contains (struct pointer_set_t *, struct varpool_node *);
52 
53 unsigned int
function_and_variable_visibility(unsigned char whole_program)54 function_and_variable_visibility (unsigned char whole_program)
55 {
56   struct cgraph_node *node;
57   struct varpool_node *vnode;
58   struct pointer_set_t *aliased_vnodes = pointer_set_create ();
59   for (vnode = varpool_nodes_queue; vnode; vnode = vnode->next_needed)
60     if (varpool_externally_visible_p
61 	(vnode, pointer_set_contains (aliased_vnodes, vnode)))
62       vnode->externally_visible = 1;
63 }
64 
65 /* { dg-final { scan-tree-dump-not "& 255" "forwprop1"} } */
66