/* { dg-do compile } */
/* { dg-options "-O2 -fdump-tree-ch2" } */
typedef union tree_node *tree;
enum tree_code
{
  OFFSET_TYPE, ENUMERAL_TYPE, BOOLEAN_TYPE, POINTER_TYPE, FIXED_POINT_TYPE,
};
struct tree_base
{
  unsigned public_flag:1;
};
struct tree_decl_with_vis
{
  unsigned comdat_flag:1;
};
union tree_node
{
  struct tree_base base;
  struct tree_decl_with_vis decl_with_vis;
};
enum tree_index
{
    TI_LONG_DOUBLE_PTR_TYPE, TI_INTEGER_PTR_TYPE, TI_VOID_TYPE, TI_PTR_TYPE,
    TI_VA_LIST_FPR_COUNTER_FIELD, TI_BOOLEAN_TYPE, TI_FILEPTR_TYPE,
    TI_CURRENT_TARGET_PRAGMA, TI_CURRENT_OPTIMIZE_PRAGMA, TI_MAX
};
extern tree global_trees[TI_MAX];
void fancy_abort (const char *file, int line, const char *function);
void
emit_support_tinfos (void)
{
  static tree *const fundamentals[] = {
    &global_trees[TI_VOID_TYPE], &global_trees[TI_BOOLEAN_TYPE],
  };
  int ix;
  for (ix = 0; fundamentals[ix]; ix++)
    {
	{
	  tree tinfo;
	    {
	      ((void) (!(((tinfo)->base.public_flag) && !(__extension__ (
									  {
									  __typeof
									  (tinfo)
									  __t
									  =
									  (tinfo);
									  __t;}
							  )->decl_with_vis.
							  comdat_flag)) ?
		       fancy_abort ("../../gcc/cp/rtti.c", 1529,
				    __FUNCTION__), 0 : 0));
	    }
	}
    }
}
/* We should copy loop header to fundamentals[0] and then fold it way into
   known value.  */
/* { dg-final { scan-tree-dump-not "fundamentals.0" "ch2"} } */
