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
      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
      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"} } */