blob: 97feb2dd41d372742cfd638971f2921a9cd82dce [file] [log] [blame]
// Copyright (c) 2022, 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 https://github.com/flutter/flutter/issues/98967.
// Verifies that compiler doesn't generate wrong code for comparison of ints
// due to a late change in the representation of EqualityCompare inputs.
import 'package:expect/expect.dart';
class C {
int? val;
@pragma('vm:never-inline')
void testImpl(bool Function(int) compare) {
for (var i = 0; i < 2; i++) {
Expect.equals(false, compare(i));
val = i;
Expect.equals(true, compare(i));
}
final mint0 = int.parse("7fffffffffffffff", radix: 16);
final mint1 = int.parse("7fffffffffffffff", radix: 16);
if (mint0 != mint1) throw 'This is the same mint value';
Expect.equals(false, compare(mint0));
val = mint0;
Expect.equals(true, compare(mint0));
Expect.equals(true, compare(mint1),
'expected two different mints with the same value compare equal');
}
@pragma('vm:never-inline')
static void blackhole(void Function() f) {
f();
}
void test() {
return testImpl((v) {
// Note: need multiple context levels in the chain to delay
// optimizer forwarding load of [val] and subsequently
// clearing null_aware flag on the equality comparison.
// Hence the closure capturing [v] below.
final result = val != null ? val == v : false;
blackhole(() => v);
return result;
});
}
}
void main() {
C().test();
}