blob: 5fca9775e640fdcd170640765c3ad2ecb5563357 [file] [log] [blame] [edit]
// Copyright (c) 2024, 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.
// SharedOptions=--enable-experiment=null-aware-elements
import '../static_type_helper.dart';
test1(String a, num x) {
<dynamic, dynamic>{?a: (x as int)};
// ^
// [analyzer] STATIC_WARNING.INVALID_NULL_AWARE_OPERATOR
x..expectStaticType<Exactly<int>>();
}
test2(String? a, num x) {
<dynamic, dynamic>{?a: (x as int)};
x..expectStaticType<Exactly<num>>();
}
test3(String a, bool b, num x) {
if (b) {
x as int;
} else {
<dynamic, dynamic>{?a: (throw 0)};
// ^
// [analyzer] STATIC_WARNING.INVALID_NULL_AWARE_OPERATOR
// Unreachable.
}
x..expectStaticType<Exactly<int>>();
}
test4(String? a, bool b, num x) {
if (b) {
x as int;
} else {
<dynamic, dynamic>{?a: (throw 0)};
// Reachable.
}
x..expectStaticType<Exactly<num>>();
}
test5(String? a) {
return <dynamic, dynamic>{?a: a..expectStaticType<Exactly<String>>()};
}
test6(String? a) {
return <dynamic, dynamic>{a: a..expectStaticType<Exactly<String?>>()};
}
expectThrows(void Function() f) {
bool hasThrown = true;
try {
f();
hasThrown = false;
} catch (e) {}
if (!hasThrown) {
throw "Expected the function to throw.";
}
}
main() {
test1("", 0);
test2("", 0);
test2(null, 0);
test3("", true, 0);
expectThrows(() => test3("", false, 0));
test4("", true, 0);
expectThrows(() => test4("", false, 0));
test4(null, true, 0);
test4(null, false, 0);
test5(null);
test5("");
test6(null);
test5("");
}