diff --git a/pkg/compiler/lib/src/ir/static_type.dart b/pkg/compiler/lib/src/ir/static_type.dart index 21b7964dc662..63eefbc8b05c 100644 --- a/pkg/compiler/lib/src/ir/static_type.dart +++ b/pkg/compiler/lib/src/ir/static_type.dart @@ -1401,8 +1401,11 @@ abstract class StaticTypeVisitor extends StaticTypeBase { @override Null visitField(ir.Field node) { thisType = new ThisInterfaceType.from(node.enclosingClass?.thisType); + _currentVariables = new Set(); 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 000000000000..7b6449f9358d --- /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)); +}