blob: de38104ef1e00f683ab21f2dd82911420cad476a [file] [log] [blame]
// Copyright (c) 2022, 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 promotion works during top level type inference. In the
// CFE, top level types are inferred earlier than method bodies, so this
// verifies that the data structures necessary to support field promotion have
// been initialized in time.
import '../static_type_helper.dart';
class C {
final int? _promotable;
final int? _notPromotable; // due to D._notPromotable
C(int i)
: _promotable = i,
_notPromotable = i;
static final staticPromotable =
((C c) => c._promotable != null ? c._promotable : 0)(new C(0));
static final staticNotPromotable =
((C c) => c._notPromotable != null ? c._notPromotable : 0)(new C(0));
final instancePromotable =
((C c) => c._promotable != null ? c._promotable : 0)(new C(0));
final instanceNotPromotable =
((C c) => c._notPromotable != null ? c._notPromotable : 0)(new C(0));
late final instancePromotableViaThis = _promotable != null ? _promotable : 0;
late final instanceNotPromotableViaThis =
_notPromotable != null ? _notPromotable : 0;
}
class D {
int? _notPromotable;
}
final topLevelPromotable =
((C c) => c._promotable != null ? c._promotable : 0)(new C(0));
final topLevelNotPromotable =
((C c) => c._notPromotable != null ? c._notPromotable : 0)(new C(0));
void testTopLevelPromotable() {
topLevelPromotable.expectStaticType<Exactly<int>>();
}
void testTopLevelNotPromotable() {
topLevelNotPromotable.expectStaticType<Exactly<int?>>();
}
void testStaticPromotable() {
C.staticPromotable.expectStaticType<Exactly<int>>();
}
void testStaticNotPromotable() {
C.staticNotPromotable.expectStaticType<Exactly<int?>>();
}
void testInstancePromotable(C c) {
c.instancePromotable.expectStaticType<Exactly<int>>();
}
void testInstanceNotPromotable(C c) {
c.instanceNotPromotable.expectStaticType<Exactly<int?>>();
}
void testInstancePromotableViaThis(C c) {
c.instancePromotableViaThis.expectStaticType<Exactly<int>>();
}
void testInstanceNotPromotableViaThis(C c) {
c.instanceNotPromotableViaThis.expectStaticType<Exactly<int?>>();
}
main() {}