1  /* { dg-do compile } */
       2  /* { dg-options "-O1 -fdump-tree-dom2" } */
       3   
       4  extern void abort (void);
       5  extern void blah (void);
       6  
       7  union tree_node;
       8  typedef union tree_node *tree;
       9  struct tree_vec
      10  {
      11            int length;
      12              tree a[1];
      13  };
      14  struct tree_type
      15  {
      16            tree binfo;
      17  };
      18  union tree_node
      19  {
      20            struct tree_type type;
      21              struct tree_vec vec;
      22  };
      23  
      24  void
      25  record_component_aliases (type)
      26       tree type;
      27  {
      28    int i;
      29    if (4 >= type->type.binfo->vec.length)
      30      abort ();
      31    for (; i < ((
      32                  {
      33                  const tree __t = type->type.binfo;
      34                  if (4 >= __t->vec.length)
      35                  abort (); type->type.binfo->vec.a[4];}
      36                )->vec.length);)
      37      {
      38        if (4 >= type->type.binfo->vec.length)
      39          abort ();
      40        blah ();
      41      }
      42  }
      43  
      44  /* The call to blah can not be eliminated.  */
      45  /* { dg-final { scan-tree-dump-times "blah \\(\\)" 1 "dom2" } } */
      46     
      47  /* There should be three IF conditionals.  */
      48  /* { dg-final { scan-tree-dump-times "if " 3 "dom2"} } */
      49                                                                                  
      50  /* There should be two loads of type.binfo.  */
      51  /* { dg-final { scan-tree-dump-times "type\\.binfo" 2 "dom2"} } */
      52   
      53  /* There should be three loads of vec.length.  */
      54  /* { dg-final { scan-tree-dump-times "vec.length" 3 "dom2"} } */
      55