blob: 7d25a2cb6644b1a1ed508fa1e6956d527b1afd3f [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.
//
// 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'));
}