| // 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. |
| // |
| // This test illustrates why it's not sound to promote field accesses on |
| // `dynamic`, even if it appears that the only thing they could possibly resolve |
| // to is promotable. The soundness can be broken by the presence of *any* class |
| // containing an implementation of `noSuchMethod` other than the one from |
| // `Object`. |
| |
| import 'package:expect/expect.dart'; |
| |
| class C { |
| final Object? _x; |
| C(this._x); |
| } |
| |
| class Unrelated { |
| Object? _value; |
| |
| noSuchMethod(invocation) => _value; |
| } |
| |
| main() { |
| dynamic d = Unrelated(); |
| d._value = 0; |
| d._x as int; // Succeeds because `Unrelated.noSuchMethod` returns `0`. |
| d._value = 'foo'; |
| // Verify that `d._x` still has type `dynamic` by calling a method that |
| // doesn't exist on `int`. |
| Expect.equals(1, d._x.indexOf('o')); |
| } |