/* { dg-do compile { target size32plus } } */ /* { dg-options "-O2 -fdump-tree-dom2-details -w" } */ union tree_node; typedef union tree_node *tree; extern unsigned char tree_contains_struct[0xdead][64]; struct tree_base { int code:16; }; struct tree_typed { tree type; }; struct tree_type_common { tree main_variant; }; extern tree build_target_option_node (void); union tree_node { struct tree_base base; struct tree_typed typed; struct tree_type_common type_common; }; tree arf (void); void error (const char *); tree convert (tree type, tree expr) { tree e = expr; int code = (type)->base.code; const char *invalid_conv_diag; tree ret; if (tree_contains_struct[expr->base.code][(42)] != 1) __builtin_abort (); if (type->type_common.main_variant == expr->typed.type->type_common.main_variant && (expr->typed.type->base.code != 123 || e->base.code == 456)) return arf (); if (expr->typed.type->base.code == 42) error ("void value not ignored as it ought to be"); } /* When the *->base.code tests in the second IF statement are false, we know that expr->typed.base->base.code has the value 123. That allows us to thread the test for the final IF statement on that path. */ /* { dg-final { scan-tree-dump-times "Threaded" 1 "dom2"} } */