diff --git a/gcc/expr.c b/gcc/expr.c index 445f15161568..adb2d4ad1f93 100644 --- a/gcc/expr.c +++ b/gcc/expr.c @@ -5919,6 +5919,13 @@ expand_expr (exp, target, tmode, modifier) placeholder_list = TREE_CHAIN (placeholder_list); return target; + case GOTO_EXPR: + if (TREE_CODE (TREE_OPERAND (exp, 0)) == LABEL_DECL) + expand_goto (TREE_OPERAND (exp, 0)); + else + expand_computed_goto (TREE_OPERAND (exp, 0)); + return const0_rtx; + case EXIT_EXPR: expand_exit_loop_if_false (NULL_PTR, invert_truthvalue (TREE_OPERAND (exp, 0))); diff --git a/gcc/tree.def b/gcc/tree.def index 16a07d80c371..71d0687043c3 100644 --- a/gcc/tree.def +++ b/gcc/tree.def @@ -721,7 +721,7 @@ DEFTREECODE (POPDCC_EXPR, "popdcc_expr", 's', 0) The type should be void and the value should be ignored. */ DEFTREECODE (LABEL_EXPR, "label_expr", 's', 1) -/* GOTO. Operand 0 is a LABEL_DECL node. +/* GOTO. Operand 0 is a LABEL_DECL node or an expression. The type should be void and the value should be ignored. */ DEFTREECODE (GOTO_EXPR, "goto_expr", 's', 1)