On Wed, 18 Apr 2012, Steven Bosscher wrote: > On Wed, Apr 18, 2012 at 11:10 AM, Richard Guenther <rguent...@suse.de> wrote: > > I wonder about > > > > @@ -1575,6 +1575,9 @@ gimplify_switch_expr (tree *expr_p, gimple_seq *pr > > tree switch_expr = *expr_p; > > gimple_seq switch_body_seq = NULL; > > enum gimplify_status ret; > > + tree index_type = TREE_TYPE (switch_expr); > > + if (index_type == void_type_node) > > + index_type = TREE_TYPE (SWITCH_COND (switch_expr)); > > > > what frontends use void_type_node here contrary to the docs in tree.def: > > > > TREE_TYPE is the original type of the condition, before any > > language required type conversions. It may be NULL, in which case > > the original type and final types are assumed to be the same. > > > > which says you'd need to handle NULL instead? Thus, can you either > > adjust the docs in tree.def or the frontends? > > That code was copied from stmt.c, and I was surprised by it, too. > > The Fortran frond end builds SWITCH_EXPRs with build3_v, i.e. > void_type_node-typed. The Go front ends also build SWITCH_EXPRs with > void_type_node. The C-family and Java front ends build SWITCH_EXPRs > with a non-void type. > > But from gimplify.c:is_gimple_stmt(): > > case SWITCH_EXPR: > (...) > /* These are always void. */ > return true; > > See these files for all the locations I could find where a SWITCH_EXPR is > built: > java/expr.c: switch_expr = build3 (SWITCH_EXPR, TREE_TYPE (selector), > selector, > go/go-gcc.cc: tree t = build3_loc(switch_location.gcc_location(), > SWITCH_EXPR, > cp/cp-gimplify.c: t = build3 (SWITCH_EXPR, SWITCH_STMT_TYPE (stmt), > c-typeck.c: cs->switch_expr = build3 (SWITCH_EXPR, orig_type, exp, > NULL_TREE, NULL_TREE); > fortran/trans-stmt.c: tmp = build3_v (SWITCH_EXPR, se.expr, tmp, NULL_TREE); > fortran/trans-stmt.c: tmp = build3_v (SWITCH_EXPR, case_num, tmp, > NULL_TREE); > fortran/trans-stmt.c: tmp = build3_v (SWITCH_EXPR, case_num, tmp, NULL_TREE); > fortran/trans-io.c: tmp = build3_v (SWITCH_EXPR, rc, tmp, NULL_TREE); > fortran/trans-decl.c: tmp = build3_v (SWITCH_EXPR, val, tmp, NULL_TREE); > ada/gcc-interface/trans.c: gnu_result = build3 (SWITCH_EXPR, > TREE_TYPE (gnu_expr), gnu_expr, > > Perhaps the Fortran and Go front ends should build SWITCH_EXPRs with a > NULL type, and gimplify_switch_expr() should assert that the > SWITCH_EXPR type is never void_type node. That would make things match > the documentation in tree.def again. I'll test a patch with these > changes and commit it if it works.
I suppose generic tree handling routines are confused by NULL TREE_TYPE and thus changing the docs to void_type_node would be more appropriate. Richard.