| Index: runtime/vm/parser.cc
|
| ===================================================================
|
| --- runtime/vm/parser.cc (revision 33288)
|
| +++ runtime/vm/parser.cc (working copy)
|
| @@ -7608,11 +7608,14 @@
|
| if (((op_kind == Token::kIS) || (op_kind == Token::kISNOT) ||
|
| (op_kind == Token::kAS)) &&
|
| type.IsMalformedOrMalbounded()) {
|
| - // Note that a type error is thrown even if the tested value is null
|
| - // in a type test or in a type cast.
|
| - // TODO(hausner): We drop the left operand. We need to
|
| - // evaluate it in case there are side effects.
|
| - left_operand = ThrowTypeError(type_pos, type);
|
| + // Note that a type error is thrown in a type test or in
|
| + // a type cast even if the tested value is null.
|
| + // We need to evaluate the left operand for potential
|
| + // side effects.
|
| + LetNode* let = new LetNode(left_operand->token_pos());
|
| + let->AddNode(left_operand);
|
| + let->AddNode(ThrowTypeError(type_pos, type));
|
| + left_operand = let;
|
| break; // Type checks and casts can't be chained.
|
| }
|
| }
|
|
|