// Copyright (c) 2015, 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. // @dart = 2.7 library tdiv_test; import 'dart:async'; import 'package:async_helper/async_helper.dart'; import '../helpers/compiler_helper.dart'; const String TEST1 = r""" foo(param) { var a = param ? 0xFFFFFFFF : 1; return a ~/ 2; // Above can be compiled to division followed by truncate. // present: ' / 2 | 0' // absent: 'tdiv' } """; const String TEST2 = r""" foo(param) { var a = param ? 0xFFFFFFFF : 1; return a ~/ 3; // Above can be compiled to division followed by truncate. // present: ' / 3 | 0' // absent: 'tdiv' } """; const String TEST3 = r""" foo(param) { var a = param ? 0xFFFFFFFF : -1; return a ~/ 2; // Potentially negative inputs go via fast helper. // present: '_tdivFast' // absent: '/' } """; const String TEST4 = r""" foo(param1, param2) { var a = param1 ? 0xFFFFFFFF : 0; return a ~/ param2; // Unknown divisor goes via full implementation. // present: '$tdiv' // absent: '/' } """; const String TEST5 = r""" foo(param1, param2) { var a = param1 ? 0xFFFFFFFF : 0; var b = param2 ? 3 : 4; return a ~/ b; // We could optimize this with range analysis, but type inference summarizes // '3 or 4' to uint31, which is not >= 2. // present: '$tdiv' // absent: '/' } """; const String TEST_REGRESS_37502 = r""" foo(param1, param2) { var a = param1 ? 1.2 : 12.3; var b = param2 ? 3.14 : 2.81; return (a ~/ b).gcd(2); // The result of ~/ is int; gcd is defined only on int and is too complex // to be inlined. // // present: 'JSInt_methods.gcd' } """; main() { runTests() async { Future check(String test) { return compile(test, entry: 'foo', check: checkerForAbsentPresent(test)); } await check(TEST1); await check(TEST2); await check(TEST3); await check(TEST4); await check(TEST5); await check(TEST_REGRESS_37502); } asyncTest(() async { print('--test from kernel------------------------------------------------'); await runTests(); }); }