diff options
Diffstat (limited to 'gcc/expr.c')
-rw-r--r-- | gcc/expr.c | 14 |
1 files changed, 13 insertions, 1 deletions
diff --git a/gcc/expr.c b/gcc/expr.c index 789c9a5a5a0..56a5f18df76 100644 --- a/gcc/expr.c +++ b/gcc/expr.c @@ -6366,7 +6366,6 @@ expand_operands (tree exp0, tree exp1, rtx target, rtx *op0, rtx *op1, DECL_RTL of the VAR_DECL. *ALT_RTL is also set if EXP is a COMPOUND_EXPR whose second argument is such a VAR_DECL, and so on recursively. */ - static rtx expand_expr_real_1 (tree, rtx, enum machine_mode, enum expand_modifier, rtx *); @@ -6459,6 +6458,15 @@ expand_expr_real_1 (tree exp, rtx target, enum machine_mode tmode, int ignore; tree context; + /* Handle ERROR_MARK before anybody tries to access its type. */ + if (TREE_CODE (exp) == ERROR_MARK || TREE_CODE (type) == ERROR_MARK) + { + op0 = CONST0_RTX (tmode); + if (op0 != 0) + return op0; + return const0_rtx; + } + mode = TYPE_MODE (type); /* Use subtarget as the target for operand 0 of a binary operation. */ subtarget = get_subtarget (target); @@ -6552,6 +6560,10 @@ expand_expr_real_1 (tree exp, rtx target, enum machine_mode tmode, return temp; } + case SSA_NAME: + return expand_expr_real_1 (SSA_NAME_VAR (exp), target, tmode, modifier, + NULL); + case PARM_DECL: if (!DECL_RTL_SET_P (exp)) { |