blob: 622d5874cd6e26e61cc8c04ae888443f7743a71b [file] [log] [blame]
// Copyright (c) 2023, 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.
// Tests that field accesses applied to a `dynamic` type are not promoted even
// if the only thing they could possibly resolve to is promotable.
//
// The rationale for this behavior is that if we allowed accesses on `dynamic`
// to be promoted under such circumstances, then the addition of *any* class
// containing an implementation of `noSuchMethod` other than the one from
// `Object` would violate soundness. (See `field_of_dynamic_with_nsm_test.dart`
// for a concrete example of this).
class C {
final Object? _x;
C(this._x);
}
void testDynamicInvocation(dynamic d) {
if (d._x is int) {
// `d._x` should not be promoted to `int`. To verify that it still has type
// `dynamic`, we try to call a method that doesn't exist on `int`.
d._x.nonExistentMethod();
}
}
main() {
testDynamicInvocation(C('not an int'));
}