// 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. import '../../static_type_helper.dart'; // This test checks whether a function parameter can be used to perform type // promotion, for various ways of declaring it. // // We test all combinations of: // - top level function, method, local named function, or function expression // - type `bool`, `Object`, `Object?`, or `dynamic` topLevelFunction_bool(int? x, bool b) { b = x != null; if (b) x.expectStaticType>(); } topLevelFunction_Object(int? x, Object b) { b = x != null; // We don't currently recognize that `b as bool` has the same value as `b`, // so we don't promote. TODO(paulberry): should we? if (b as bool) x.expectStaticType>(); } topLevelFunction_ObjectQ(int? x, Object? b) { b = x != null; // We don't currently recognize that `b as bool` has the same value as `b`, // so we don't promote. TODO(paulberry): should we? if (b as bool) x.expectStaticType>(); } topLevelFunction_dynamic(int? x, dynamic b) { b = x != null; if (b) x.expectStaticType>(); } class C { method_bool(int? x, bool b) { b = x != null; if (b) x.expectStaticType>(); } method_Object(int? x, Object b) { b = x != null; // We don't currently recognize that `b as bool` has the same value as `b`, // so we don't promote. TODO(paulberry): should we? if (b as bool) x.expectStaticType>(); } method_ObjectQ(int? x, Object? b) { b = x != null; // We don't currently recognize that `b as bool` has the same value as `b`, // so we don't promote. TODO(paulberry): should we? if (b as bool) x.expectStaticType>(); } method_dynamic(int? x, dynamic b) { b = x != null; if (b) x.expectStaticType>(); } } localTest(int? x) { localNamedFunction_bool(bool b) { b = x != null; if (b) x.expectStaticType>(); } localNamedFunction_bool(false); localNamedFunction_Object(Object b) { b = x != null; // We don't currently recognize that `b as bool` has the same value as `b`, // so we don't promote. TODO(paulberry): should we? if (b as bool) x.expectStaticType>(); } localNamedFunction_Object(Object()); localNamedFunction_ObjectQ(Object? b) { b = x != null; // We don't currently recognize that `b as bool` has the same value as `b`, // so we don't promote. TODO(paulberry): should we? if (b as bool) x.expectStaticType>(); } localNamedFunction_ObjectQ(null); localNamedFunction_dynamic(dynamic b) { b = x != null; if (b) x.expectStaticType>(); } localNamedFunction_dynamic('foo'); (bool b) { b = x != null; if (b) x.expectStaticType>(); }(false); (Object b) { b = x != null; // We don't currently recognize that `b as bool` has the same value as `b`, // so we don't promote. TODO(paulberry): should we? if (b as bool) x.expectStaticType>(); }(Object()); (Object? b) { b = x != null; // We don't currently recognize that `b as bool` has the same value as `b`, // so we don't promote. TODO(paulberry): should we? if (b as bool) x.expectStaticType>(); }(null); (dynamic b) { b = x != null; if (b) x.expectStaticType>(); }('foo'); } main() { topLevelFunction_bool(null, false); topLevelFunction_bool(0, false); topLevelFunction_Object(null, Object()); topLevelFunction_Object(0, Object()); topLevelFunction_ObjectQ(null, null); topLevelFunction_ObjectQ(0, null); topLevelFunction_dynamic(null, 'foo'); topLevelFunction_dynamic(0, 'foo'); C().method_bool(null, false); C().method_bool(0, false); C().method_Object(null, Object()); C().method_Object(0, Object()); C().method_ObjectQ(null, null); C().method_ObjectQ(0, null); C().method_dynamic(null, 'foo'); C().method_dynamic(0, 'foo'); localTest(null); localTest(0); }