// Copyright (c) 2020, 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 Issue #40349: /// /// Before the fix, this code was accidentally generating a type check twice. /// In between the two checks, code to update `_foo` was overriding a temporary /// variable used by the check subexpression, which made the code for the /// second check invalid. /// /// The second check should not have been generated, but it was emitted due to /// a broken invariant of the SSA generate-at-use logic. void main() { // `x` which is used multiple times after inilining, so a temporary is used. x.method(40); } dynamic x = Wrapper(); class A { int _foo = 0; List list = [null]; @pragma('dart2js:tryInline') void internalMethod(E value) { // The update and use of `_foo` requires a separate temporary which reuses // the same variable given to `x` (technically `x` is no longer live). _foo = (_foo + 1) & 0; // This use of `value` accidentally contains the second check, which // still refers to the temporary assuming it was `x` and not `_foo`. list[_foo] = value; } } class Wrapper { A a = A(); @pragma('dart2js:tryInline') method(T t) => a.internalMethod(t); }