/* { dg-do compile } */
/* { dg-options "-O2 -fdump-tree-optimized -fno-short-enums" } */
typedef const union tree_node *const_tree;
typedef struct
{
}
double_int;
double_int double_int_zext (double_int, unsigned);
enum tree_code
{ ERROR_MARK, IDENTIFIER_NODE, TREE_LIST, BLOCK, ENUMERAL_TYPE, BOOLEAN_TYPE,
    INTEGER_TYPE, ARRAY_TYPE, INTEGER_CST, VAR_DECL, PARM_DECL, RESULT_DECL,
  };
enum tree_code_class
{ tcc_exceptional, tcc_constant, tcc_type, tcc_declaration, tcc_reference, };
struct tree_base
{
  __extension__ enum tree_code code:16;
  unsigned unsigned_flag:1;
};
struct tree_type
{
  unsigned int precision:10;
  union tree_type_symtab
  {
  } symtab;
};
union tree_node
{
  struct tree_base base;
  struct tree_type type;
};
const enum tree_code_class tree_code_type[] =
{ tcc_exceptional, 1, 0, 0, 0, 0, 2, };
extern void tree_class_check_failed (const_tree, const char *);

void
int_fits_type_p (const_tree c, const_tree type)
{
  double_int dc, dd;
  {
    if (((enum tree_code) (type)->base.code) == INTEGER_TYPE && ((
								   {
								   __typeof
								   (type) __t
								   = (type);
								   if
								   (tree_code_type
								    [(int)
								     (((enum
									tree_code)
								       (__t)->
								       base.
								       code))]
								    !=
								    (tcc_type))
								   tree_class_check_failed
								   (__t,
								    __FUNCTION__);
								   __t;})->
								 base.
								 unsigned_flag))
      dd = double_int_zext (dd, ((
				   {
				   __typeof (type) __t = (type);
				   if (tree_code_type
				       [(int)
					(((enum tree_code) (__t)->base.
					  code))] !=
				       (tcc_type))
				   tree_class_check_failed (__t,
							    __FUNCTION__);
				   __t;}
				 )->type.precision));
}
}
/* The switch should be switch converted and later constant propagated.  */
/* { dg-final { scan-tree-dump-not "tree_code_type" "optimized"} } */
