Ensure we have a scope for variables when visiting fields

Fixes https://github.com/dart-lang/sdk/issues/36864

Change-Id: I66d70cc30b26bd069d4ab5e2b98f0f5954f3ef59
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/101460
Auto-Submit: Sigmund Cherem <sigmund@google.com>
Commit-Queue: Johnni Winther <johnniwinther@google.com>
Reviewed-by: Johnni Winther <johnniwinther@google.com>
diff --git a/pkg/compiler/lib/src/ir/static_type.dart b/pkg/compiler/lib/src/ir/static_type.dart
index 7aee79e..9731e80 100644
--- a/pkg/compiler/lib/src/ir/static_type.dart
+++ b/pkg/compiler/lib/src/ir/static_type.dart
@@ -1349,8 +1349,11 @@
   @override
   Null visitField(ir.Field node) {
     thisType = new ThisInterfaceType.from(node.enclosingClass?.thisType);
+    _currentVariables = new Set<ir.VariableDeclaration>();
     visitNode(node.initializer);
     handleField(node);
+    _invalidatedVariables.removeAll(_currentVariables);
+    _currentVariables = null;
     thisType = null;
   }
 
diff --git a/tests/compiler/dart2js_extra/block_expression_on_field_test.dart b/tests/compiler/dart2js_extra/block_expression_on_field_test.dart
new file mode 100644
index 0000000..7b6449f
--- /dev/null
+++ b/tests/compiler/dart2js_extra/block_expression_on_field_test.dart
@@ -0,0 +1,27 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/// Regression test for #36864
+///
+/// Block expressions in top-level fields used to crash the compiler.
+import "package:expect/expect.dart";
+
+final _a = {
+  ...{1}
+};
+
+class B {
+  static Set _b = {
+    ...{2}
+  };
+  Set _c = {
+    ...{3}
+  };
+}
+
+main() {
+  Expect.setEquals({1}, _a);
+  Expect.setEquals({2}, B._b);
+  Expect.setEquals({3}, (new B()._c));
+}