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));
+}