/* { dg-do compile } */
/* { dg-options "-O3 -fno-exceptions" } */

typedef struct tree_node *tree;
enum tree_code { RECORD_TYPE, QUAL_UNION_TYPE };
enum tree_code_class {};
struct tree_base {
  tree_code code : 16;
};
struct tree_node {
  tree_base base;
};
extern tree_code_class tree_code_type[];
void tree_check_failed() __attribute__((__noreturn__));
tree tree_check3(tree __t, tree_code __c1, tree_code __c3) {
  if (__t->base.code != __c1 && __t->base.code != __c3)
    tree_check_failed();
  return __t;
}
tree add_type_duplicate_type;
void add_type_duplicate() {
  if (tree_code_type[add_type_duplicate_type->base.code])
    if (add_type_duplicate_type->base.code == RECORD_TYPE)
      for (;
           tree_check3(add_type_duplicate_type, RECORD_TYPE, QUAL_UNION_TYPE);)
        tree_check3(add_type_duplicate_type, RECORD_TYPE, QUAL_UNION_TYPE);
}
