From d2950737b8a295664e9da8df3710722215e1cc1e Mon Sep 17 00:00:00 2001 From: Johnni Winther Date: Mon, 16 Mar 2020 08:30:08 +0000 Subject: [PATCH] [cfe] Add test for covariant late final fields Closes #40805 Change-Id: I896bce935803a951cfb8c9c0d0f70a6227de2413 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/139464 Reviewed-by: Jens Johansen Commit-Queue: Johnni Winther --- .../testcases/late_lowering/issue40805.dart | 15 ++++++++++ .../issue40805.dart.outline.expect | 19 ++++++++++++ .../issue40805.dart.strong.expect | 29 +++++++++++++++++++ .../issue40805.dart.strong.transformed.expect | 29 +++++++++++++++++++ .../late_lowering/issue40805.dart.weak.expect | 29 +++++++++++++++++++ .../issue40805.dart.weak.transformed.expect | 29 +++++++++++++++++++ pkg/front_end/testcases/nnbd/issue40805.dart | 15 ++++++++++ .../nnbd/issue40805.dart.outline.expect | 17 +++++++++++ .../nnbd/issue40805.dart.strong.expect | 21 ++++++++++++++ .../issue40805.dart.strong.transformed.expect | 21 ++++++++++++++ .../nnbd/issue40805.dart.weak.expect | 21 ++++++++++++++ .../issue40805.dart.weak.transformed.expect | 21 ++++++++++++++ .../testcases/text_serialization.status | 2 ++ 13 files changed, 268 insertions(+) create mode 100644 pkg/front_end/testcases/late_lowering/issue40805.dart create mode 100644 pkg/front_end/testcases/late_lowering/issue40805.dart.outline.expect create mode 100644 pkg/front_end/testcases/late_lowering/issue40805.dart.strong.expect create mode 100644 pkg/front_end/testcases/late_lowering/issue40805.dart.strong.transformed.expect create mode 100644 pkg/front_end/testcases/late_lowering/issue40805.dart.weak.expect create mode 100644 pkg/front_end/testcases/late_lowering/issue40805.dart.weak.transformed.expect create mode 100644 pkg/front_end/testcases/nnbd/issue40805.dart create mode 100644 pkg/front_end/testcases/nnbd/issue40805.dart.outline.expect create mode 100644 pkg/front_end/testcases/nnbd/issue40805.dart.strong.expect create mode 100644 pkg/front_end/testcases/nnbd/issue40805.dart.strong.transformed.expect create mode 100644 pkg/front_end/testcases/nnbd/issue40805.dart.weak.expect create mode 100644 pkg/front_end/testcases/nnbd/issue40805.dart.weak.transformed.expect diff --git a/pkg/front_end/testcases/late_lowering/issue40805.dart b/pkg/front_end/testcases/late_lowering/issue40805.dart new file mode 100644 index 00000000000..9f68135e6d7 --- /dev/null +++ b/pkg/front_end/testcases/late_lowering/issue40805.dart @@ -0,0 +1,15 @@ +// Copyright (c) 2020, 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. + +main() { + D().x = 3.14; +} + +class C { + covariant late final int x; +} + +class D extends C { + set x(num value) { super.x = value.toInt(); } +} \ No newline at end of file diff --git a/pkg/front_end/testcases/late_lowering/issue40805.dart.outline.expect b/pkg/front_end/testcases/late_lowering/issue40805.dart.outline.expect new file mode 100644 index 00000000000..094d748f7e7 --- /dev/null +++ b/pkg/front_end/testcases/late_lowering/issue40805.dart.outline.expect @@ -0,0 +1,19 @@ +library /*isNonNullableByDefault*/; +import self as self; +import "dart:core" as core; + +class C extends core::Object { + covariant field core::int? _#C#x; + synthetic constructor •() → self::C + ; + get x() → core::int; + set x(core::int #t1) → void; +} +class D extends self::C { + synthetic constructor •() → self::D + ; + set x(core::num value) → void + ; +} +static method main() → dynamic + ; diff --git a/pkg/front_end/testcases/late_lowering/issue40805.dart.strong.expect b/pkg/front_end/testcases/late_lowering/issue40805.dart.strong.expect new file mode 100644 index 00000000000..b0526f24bd2 --- /dev/null +++ b/pkg/front_end/testcases/late_lowering/issue40805.dart.strong.expect @@ -0,0 +1,29 @@ +library /*isNonNullableByDefault*/; +import self as self; +import "dart:core" as core; +import "dart:_internal" as _in; + +class C extends core::Object { + covariant field core::int? _#C#x = null; + synthetic constructor •() → self::C + : super core::Object::•() + ; + get x() → core::int + return let final core::int? #t1 = this.{self::C::_#C#x} in #t1.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Field 'x' has not been initialized.") : #t1{core::int}; + set x(core::int #t2) → void + if(this.{self::C::_#C#x}.==(null)) + this.{self::C::_#C#x} = #t2; + else + throw new _in::LateInitializationErrorImpl::•("Field 'x' has already been initialized."); +} +class D extends self::C { + synthetic constructor •() → self::D + : super self::C::•() + ; + set x(core::num value) → void { + super.{self::C::x} = value.{core::num::toInt}(); + } +} +static method main() → dynamic { + new self::D::•().{self::D::x} = 3.14; +} diff --git a/pkg/front_end/testcases/late_lowering/issue40805.dart.strong.transformed.expect b/pkg/front_end/testcases/late_lowering/issue40805.dart.strong.transformed.expect new file mode 100644 index 00000000000..b0526f24bd2 --- /dev/null +++ b/pkg/front_end/testcases/late_lowering/issue40805.dart.strong.transformed.expect @@ -0,0 +1,29 @@ +library /*isNonNullableByDefault*/; +import self as self; +import "dart:core" as core; +import "dart:_internal" as _in; + +class C extends core::Object { + covariant field core::int? _#C#x = null; + synthetic constructor •() → self::C + : super core::Object::•() + ; + get x() → core::int + return let final core::int? #t1 = this.{self::C::_#C#x} in #t1.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Field 'x' has not been initialized.") : #t1{core::int}; + set x(core::int #t2) → void + if(this.{self::C::_#C#x}.==(null)) + this.{self::C::_#C#x} = #t2; + else + throw new _in::LateInitializationErrorImpl::•("Field 'x' has already been initialized."); +} +class D extends self::C { + synthetic constructor •() → self::D + : super self::C::•() + ; + set x(core::num value) → void { + super.{self::C::x} = value.{core::num::toInt}(); + } +} +static method main() → dynamic { + new self::D::•().{self::D::x} = 3.14; +} diff --git a/pkg/front_end/testcases/late_lowering/issue40805.dart.weak.expect b/pkg/front_end/testcases/late_lowering/issue40805.dart.weak.expect new file mode 100644 index 00000000000..b0526f24bd2 --- /dev/null +++ b/pkg/front_end/testcases/late_lowering/issue40805.dart.weak.expect @@ -0,0 +1,29 @@ +library /*isNonNullableByDefault*/; +import self as self; +import "dart:core" as core; +import "dart:_internal" as _in; + +class C extends core::Object { + covariant field core::int? _#C#x = null; + synthetic constructor •() → self::C + : super core::Object::•() + ; + get x() → core::int + return let final core::int? #t1 = this.{self::C::_#C#x} in #t1.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Field 'x' has not been initialized.") : #t1{core::int}; + set x(core::int #t2) → void + if(this.{self::C::_#C#x}.==(null)) + this.{self::C::_#C#x} = #t2; + else + throw new _in::LateInitializationErrorImpl::•("Field 'x' has already been initialized."); +} +class D extends self::C { + synthetic constructor •() → self::D + : super self::C::•() + ; + set x(core::num value) → void { + super.{self::C::x} = value.{core::num::toInt}(); + } +} +static method main() → dynamic { + new self::D::•().{self::D::x} = 3.14; +} diff --git a/pkg/front_end/testcases/late_lowering/issue40805.dart.weak.transformed.expect b/pkg/front_end/testcases/late_lowering/issue40805.dart.weak.transformed.expect new file mode 100644 index 00000000000..b0526f24bd2 --- /dev/null +++ b/pkg/front_end/testcases/late_lowering/issue40805.dart.weak.transformed.expect @@ -0,0 +1,29 @@ +library /*isNonNullableByDefault*/; +import self as self; +import "dart:core" as core; +import "dart:_internal" as _in; + +class C extends core::Object { + covariant field core::int? _#C#x = null; + synthetic constructor •() → self::C + : super core::Object::•() + ; + get x() → core::int + return let final core::int? #t1 = this.{self::C::_#C#x} in #t1.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Field 'x' has not been initialized.") : #t1{core::int}; + set x(core::int #t2) → void + if(this.{self::C::_#C#x}.==(null)) + this.{self::C::_#C#x} = #t2; + else + throw new _in::LateInitializationErrorImpl::•("Field 'x' has already been initialized."); +} +class D extends self::C { + synthetic constructor •() → self::D + : super self::C::•() + ; + set x(core::num value) → void { + super.{self::C::x} = value.{core::num::toInt}(); + } +} +static method main() → dynamic { + new self::D::•().{self::D::x} = 3.14; +} diff --git a/pkg/front_end/testcases/nnbd/issue40805.dart b/pkg/front_end/testcases/nnbd/issue40805.dart new file mode 100644 index 00000000000..9f68135e6d7 --- /dev/null +++ b/pkg/front_end/testcases/nnbd/issue40805.dart @@ -0,0 +1,15 @@ +// Copyright (c) 2020, 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. + +main() { + D().x = 3.14; +} + +class C { + covariant late final int x; +} + +class D extends C { + set x(num value) { super.x = value.toInt(); } +} \ No newline at end of file diff --git a/pkg/front_end/testcases/nnbd/issue40805.dart.outline.expect b/pkg/front_end/testcases/nnbd/issue40805.dart.outline.expect new file mode 100644 index 00000000000..260c576840b --- /dev/null +++ b/pkg/front_end/testcases/nnbd/issue40805.dart.outline.expect @@ -0,0 +1,17 @@ +library /*isNonNullableByDefault*/; +import self as self; +import "dart:core" as core; + +class C extends core::Object { + late covariant final [setter] field core::int x; + synthetic constructor •() → self::C + ; +} +class D extends self::C { + synthetic constructor •() → self::D + ; + set x(covariant core::num value) → void + ; +} +static method main() → dynamic + ; diff --git a/pkg/front_end/testcases/nnbd/issue40805.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue40805.dart.strong.expect new file mode 100644 index 00000000000..12e6ed1a200 --- /dev/null +++ b/pkg/front_end/testcases/nnbd/issue40805.dart.strong.expect @@ -0,0 +1,21 @@ +library /*isNonNullableByDefault*/; +import self as self; +import "dart:core" as core; + +class C extends core::Object { + late covariant final [setter] field core::int x; + synthetic constructor •() → self::C + : super core::Object::•() + ; +} +class D extends self::C { + synthetic constructor •() → self::D + : super self::C::•() + ; + set x(covariant core::num value) → void { + super.{self::C::x} = value.{core::num::toInt}(); + } +} +static method main() → dynamic { + new self::D::•().{self::D::x} = 3.14; +} diff --git a/pkg/front_end/testcases/nnbd/issue40805.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue40805.dart.strong.transformed.expect new file mode 100644 index 00000000000..12e6ed1a200 --- /dev/null +++ b/pkg/front_end/testcases/nnbd/issue40805.dart.strong.transformed.expect @@ -0,0 +1,21 @@ +library /*isNonNullableByDefault*/; +import self as self; +import "dart:core" as core; + +class C extends core::Object { + late covariant final [setter] field core::int x; + synthetic constructor •() → self::C + : super core::Object::•() + ; +} +class D extends self::C { + synthetic constructor •() → self::D + : super self::C::•() + ; + set x(covariant core::num value) → void { + super.{self::C::x} = value.{core::num::toInt}(); + } +} +static method main() → dynamic { + new self::D::•().{self::D::x} = 3.14; +} diff --git a/pkg/front_end/testcases/nnbd/issue40805.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue40805.dart.weak.expect new file mode 100644 index 00000000000..12e6ed1a200 --- /dev/null +++ b/pkg/front_end/testcases/nnbd/issue40805.dart.weak.expect @@ -0,0 +1,21 @@ +library /*isNonNullableByDefault*/; +import self as self; +import "dart:core" as core; + +class C extends core::Object { + late covariant final [setter] field core::int x; + synthetic constructor •() → self::C + : super core::Object::•() + ; +} +class D extends self::C { + synthetic constructor •() → self::D + : super self::C::•() + ; + set x(covariant core::num value) → void { + super.{self::C::x} = value.{core::num::toInt}(); + } +} +static method main() → dynamic { + new self::D::•().{self::D::x} = 3.14; +} diff --git a/pkg/front_end/testcases/nnbd/issue40805.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue40805.dart.weak.transformed.expect new file mode 100644 index 00000000000..12e6ed1a200 --- /dev/null +++ b/pkg/front_end/testcases/nnbd/issue40805.dart.weak.transformed.expect @@ -0,0 +1,21 @@ +library /*isNonNullableByDefault*/; +import self as self; +import "dart:core" as core; + +class C extends core::Object { + late covariant final [setter] field core::int x; + synthetic constructor •() → self::C + : super core::Object::•() + ; +} +class D extends self::C { + synthetic constructor •() → self::D + : super self::C::•() + ; + set x(covariant core::num value) → void { + super.{self::C::x} = value.{core::num::toInt}(); + } +} +static method main() → dynamic { + new self::D::•().{self::D::x} = 3.14; +} diff --git a/pkg/front_end/testcases/text_serialization.status b/pkg/front_end/testcases/text_serialization.status index b6c3cba5b15..0ac1a3fdc25 100644 --- a/pkg/front_end/testcases/text_serialization.status +++ b/pkg/front_end/testcases/text_serialization.status @@ -1221,6 +1221,7 @@ late_lowering/instance_nullable_final_field_without_initializer: TextSerializati late_lowering/issue40093: TextSerializationFailure late_lowering/issue40373: TextSerializationFailure late_lowering/issue40373b: TextSerializationFailure +late_lowering/issue40805: TextSerializationFailure late_lowering/late_field_inference: TextSerializationFailure late_lowering/late_field_with_initializer: TextSerializationFailure late_lowering/late_field_without_initializer: TextSerializationFailure @@ -1277,6 +1278,7 @@ nnbd/issue40093: TextSerializationFailure nnbd/issue40134: TextSerializationFailure nnbd/issue40512/issue40512: TextSerializationFailure nnbd/issue40600: TextSerializationFailure +nnbd/issue40805: TextSerializationFailure nnbd/issue_39286: TextSerializationFailure nnbd/issue_39286_2: TextSerializationFailure nnbd/late: TextSerializationFailure