| Index: runtime/vm/parser.h
 | 
| diff --git a/runtime/vm/parser.h b/runtime/vm/parser.h
 | 
| index 2c5acf3e4c6a7969334c5eed3f3633f161a9afea..81aff04f9c5d74617a2958609b71c4e76fba9f07 100644
 | 
| --- a/runtime/vm/parser.h
 | 
| +++ b/runtime/vm/parser.h
 | 
| @@ -48,11 +48,13 @@ class ParsedFunction : public ZoneAllocated {
 | 
|          saved_entry_context_var_(NULL),
 | 
|          expression_temp_var_(NULL),
 | 
|          finally_return_temp_var_(NULL),
 | 
| +        await_temps_scope_(NULL),
 | 
|          deferred_prefixes_(new ZoneGrowableArray<const LibraryPrefix*>()),
 | 
|          first_parameter_index_(0),
 | 
|          first_stack_local_index_(0),
 | 
|          num_copied_params_(0),
 | 
|          num_stack_locals_(0),
 | 
| +        have_seen_await_expr_(false),
 | 
|          isolate_(isolate) {
 | 
|      ASSERT(function.IsZoneHandle());
 | 
|    }
 | 
| @@ -138,6 +140,21 @@ class ParsedFunction : public ZoneAllocated {
 | 
|  
 | 
|    void AllocateVariables();
 | 
|  
 | 
| +  void set_await_temps_scope(LocalScope* scope) {
 | 
| +    ASSERT(await_temps_scope_ == NULL);
 | 
| +    await_temps_scope_ = scope;
 | 
| +  }
 | 
| +  LocalScope* await_temps_scope() const {
 | 
| +    ASSERT(await_temps_scope_ != NULL);
 | 
| +    return await_temps_scope_;
 | 
| +  }
 | 
| +
 | 
| +  void record_await() {
 | 
| +    have_seen_await_expr_ = true;
 | 
| +  }
 | 
| +  void reset_have_seen_await() { have_seen_await_expr_ = false; }
 | 
| +  bool have_seen_await() const { return have_seen_await_expr_; }
 | 
| +
 | 
|    Isolate* isolate() const { return isolate_; }
 | 
|  
 | 
|   private:
 | 
| @@ -150,12 +167,14 @@ class ParsedFunction : public ZoneAllocated {
 | 
|    LocalVariable* saved_entry_context_var_;
 | 
|    LocalVariable* expression_temp_var_;
 | 
|    LocalVariable* finally_return_temp_var_;
 | 
| +  LocalScope* await_temps_scope_;
 | 
|    ZoneGrowableArray<const LibraryPrefix*>* deferred_prefixes_;
 | 
|  
 | 
|    int first_parameter_index_;
 | 
|    int first_stack_local_index_;
 | 
|    int num_copied_params_;
 | 
|    int num_stack_locals_;
 | 
| +  bool have_seen_await_expr_;
 | 
|  
 | 
|    Isolate* isolate_;
 | 
|  
 | 
| @@ -502,6 +521,7 @@ class Parser : public ValueObject {
 | 
|    void OpenBlock();
 | 
|    void OpenLoopBlock();
 | 
|    void OpenFunctionBlock(const Function& func);
 | 
| +  void OpenAsyncClosure();
 | 
|    RawFunction* OpenAsyncFunction(intptr_t formal_param_pos);
 | 
|    SequenceNode* CloseBlock();
 | 
|    SequenceNode* CloseAsyncFunction(const Function& closure,
 | 
| @@ -586,6 +606,8 @@ class Parser : public ValueObject {
 | 
|    static const bool kAllowConst = false;
 | 
|    static const bool kConsumeCascades = true;
 | 
|    static const bool kNoCascades = false;
 | 
| +  AstNode* ParseAwaitableExpr(bool require_compiletime_const,
 | 
| +                              bool consume_cascades);
 | 
|    AstNode* ParseExpr(bool require_compiletime_const, bool consume_cascades);
 | 
|    AstNode* ParseExprList();
 | 
|    AstNode* ParseConditionalExpr();
 | 
| 
 |