1 /* { dg-do compile { target size32plus } } */
2 /* { dg-options "-O2 -fdump-tree-dom2-details -w" } */
3 
4 union tree_node;
5 typedef union tree_node *tree;
6 extern unsigned char tree_contains_struct[0xdead][64];
7 struct tree_base
8 {
9   int code:16;
10 };
11 struct tree_typed
12 {
13   tree type;
14 };
15 struct tree_type_common
16 {
17   tree main_variant;
18 };
19 extern tree build_target_option_node (void);
20 union tree_node
21 {
22   struct tree_base base;
23   struct tree_typed typed;
24   struct tree_type_common type_common;
25 };
26 tree
convert(tree type,tree expr)27 convert (tree type, tree expr)
28 {
29   tree e = expr;
30   int code = (type)->base.code;
31   const char *invalid_conv_diag;
32   tree ret;
33   if (tree_contains_struct[expr->base.code][(42)] != 1)
34     abort ();
35   if (type->type_common.main_variant == expr->typed.type->type_common.main_variant
36       && (expr->typed.type->base.code != 123
37 	  || e->base.code == 456))
38     return arf ();
39   if (expr->typed.type->base.code == 42)
40     error ("void value not ignored as it ought to be");
41 }
42 
43 /* When the *->base.code tests in the second IF statement are false, we
44    know that expr->typed.base->base.code has the value 123.  That allows
45    us to thread the test for the final IF statement on that path.  */
46 /* { dg-final { scan-tree-dump-times "Threaded" 1 "dom2"} } */
47