From cd58ce5030efcbfcf5cfd4b63e4da54bf7258567 Mon Sep 17 00:00:00 2001 From: Johnni Winther Date: Fri, 10 Nov 2023 13:40:19 +0000 Subject: [PATCH] [cfe] Add test for issue 53740 Closes #53740 Change-Id: I14edfcd610366bd0f759030e1eb0dd057fbbaeae Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/335443 Reviewed-by: Jens Johansen Commit-Queue: Johnni Winther --- .../testcases/extension_types/issue53740.dart | 21 ++++++++ .../issue53740.dart.strong.expect | 48 +++++++++++++++++++ .../issue53740.dart.strong.transformed.expect | 48 +++++++++++++++++++ .../issue53740.dart.textual_outline.expect | 10 ++++ ...53740.dart.textual_outline_modelled.expect | 10 ++++ .../issue53740.dart.weak.expect | 48 +++++++++++++++++++ .../issue53740.dart.weak.modular.expect | 48 +++++++++++++++++++ .../issue53740.dart.weak.outline.expect | 42 ++++++++++++++++ .../issue53740.dart.weak.transformed.expect | 48 +++++++++++++++++++ 9 files changed, 323 insertions(+) create mode 100644 pkg/front_end/testcases/extension_types/issue53740.dart create mode 100644 pkg/front_end/testcases/extension_types/issue53740.dart.strong.expect create mode 100644 pkg/front_end/testcases/extension_types/issue53740.dart.strong.transformed.expect create mode 100644 pkg/front_end/testcases/extension_types/issue53740.dart.textual_outline.expect create mode 100644 pkg/front_end/testcases/extension_types/issue53740.dart.textual_outline_modelled.expect create mode 100644 pkg/front_end/testcases/extension_types/issue53740.dart.weak.expect create mode 100644 pkg/front_end/testcases/extension_types/issue53740.dart.weak.modular.expect create mode 100644 pkg/front_end/testcases/extension_types/issue53740.dart.weak.outline.expect create mode 100644 pkg/front_end/testcases/extension_types/issue53740.dart.weak.transformed.expect diff --git a/pkg/front_end/testcases/extension_types/issue53740.dart b/pkg/front_end/testcases/extension_types/issue53740.dart new file mode 100644 index 00000000000..c8d7b5e5b7e --- /dev/null +++ b/pkg/front_end/testcases/extension_types/issue53740.dart @@ -0,0 +1,21 @@ +// 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 b +// BSD-style license that can be found in the LICENSE file. + +class A { + void foo() {} +} + +class B implements A { + @override + void foo([int i = 0]) {} +} + +extension type ET1(B b) implements A {} + +extension type ET2(B b) implements ET1, B {} + +void main() { + var et2 = ET2(B()); + et2.foo(42); +} \ No newline at end of file diff --git a/pkg/front_end/testcases/extension_types/issue53740.dart.strong.expect b/pkg/front_end/testcases/extension_types/issue53740.dart.strong.expect new file mode 100644 index 00000000000..80dffe301f1 --- /dev/null +++ b/pkg/front_end/testcases/extension_types/issue53740.dart.strong.expect @@ -0,0 +1,48 @@ +library; +import self as self; +import "dart:core" as core; + +class A extends core::Object { + synthetic constructor •() → self::A + : super core::Object::•() + ; + method foo() → void {} +} +class B extends core::Object implements self::A { + synthetic constructor •() → self::B + : super core::Object::•() + ; + @#C1 + method foo([core::int i = #C2]) → void {} +} +extension type ET1(self::B b) implements self::A { + abstract extension-type-member representation-field get b() → self::B; + constructor • = self::ET1|constructor#; + constructor tearoff • = self::ET1|constructor#_#new#tearOff; +} +extension type ET2(self::B b) implements self::ET1 /* = self::B */, self::B { + abstract extension-type-member representation-field get b() → self::B; + constructor • = self::ET2|constructor#; + constructor tearoff • = self::ET2|constructor#_#new#tearOff; +} +static extension-type-member method ET1|constructor#(self::B b) → self::ET1 /* = self::B */ { + lowered final self::ET1 /* = self::B */ #this = b; + return #this; +} +static extension-type-member method ET1|constructor#_#new#tearOff(self::B b) → self::ET1 /* = self::B */ + return self::ET1|constructor#(b); +static extension-type-member method ET2|constructor#(self::B b) → self::ET2 /* = self::B */ { + lowered final self::ET2 /* = self::B */ #this = b; + return #this; +} +static extension-type-member method ET2|constructor#_#new#tearOff(self::B b) → self::ET2 /* = self::B */ + return self::ET2|constructor#(b); +static method main() → void { + self::ET2 /* = self::B */ et2 = self::ET2|constructor#(new self::B::•()); + et2.{self::B::foo}(42){([core::int]) → void}; +} + +constants { + #C1 = core::_Override {} + #C2 = 0 +} diff --git a/pkg/front_end/testcases/extension_types/issue53740.dart.strong.transformed.expect b/pkg/front_end/testcases/extension_types/issue53740.dart.strong.transformed.expect new file mode 100644 index 00000000000..80dffe301f1 --- /dev/null +++ b/pkg/front_end/testcases/extension_types/issue53740.dart.strong.transformed.expect @@ -0,0 +1,48 @@ +library; +import self as self; +import "dart:core" as core; + +class A extends core::Object { + synthetic constructor •() → self::A + : super core::Object::•() + ; + method foo() → void {} +} +class B extends core::Object implements self::A { + synthetic constructor •() → self::B + : super core::Object::•() + ; + @#C1 + method foo([core::int i = #C2]) → void {} +} +extension type ET1(self::B b) implements self::A { + abstract extension-type-member representation-field get b() → self::B; + constructor • = self::ET1|constructor#; + constructor tearoff • = self::ET1|constructor#_#new#tearOff; +} +extension type ET2(self::B b) implements self::ET1 /* = self::B */, self::B { + abstract extension-type-member representation-field get b() → self::B; + constructor • = self::ET2|constructor#; + constructor tearoff • = self::ET2|constructor#_#new#tearOff; +} +static extension-type-member method ET1|constructor#(self::B b) → self::ET1 /* = self::B */ { + lowered final self::ET1 /* = self::B */ #this = b; + return #this; +} +static extension-type-member method ET1|constructor#_#new#tearOff(self::B b) → self::ET1 /* = self::B */ + return self::ET1|constructor#(b); +static extension-type-member method ET2|constructor#(self::B b) → self::ET2 /* = self::B */ { + lowered final self::ET2 /* = self::B */ #this = b; + return #this; +} +static extension-type-member method ET2|constructor#_#new#tearOff(self::B b) → self::ET2 /* = self::B */ + return self::ET2|constructor#(b); +static method main() → void { + self::ET2 /* = self::B */ et2 = self::ET2|constructor#(new self::B::•()); + et2.{self::B::foo}(42){([core::int]) → void}; +} + +constants { + #C1 = core::_Override {} + #C2 = 0 +} diff --git a/pkg/front_end/testcases/extension_types/issue53740.dart.textual_outline.expect b/pkg/front_end/testcases/extension_types/issue53740.dart.textual_outline.expect new file mode 100644 index 00000000000..0fae0c66caa --- /dev/null +++ b/pkg/front_end/testcases/extension_types/issue53740.dart.textual_outline.expect @@ -0,0 +1,10 @@ +class A { + void foo() {} +} +class B implements A { + @override + void foo([int i = 0]) {} +} +extension type ET1(B b) implements A {} +extension type ET2(B b) implements ET1, B {} +void main() {} diff --git a/pkg/front_end/testcases/extension_types/issue53740.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/extension_types/issue53740.dart.textual_outline_modelled.expect new file mode 100644 index 00000000000..0fae0c66caa --- /dev/null +++ b/pkg/front_end/testcases/extension_types/issue53740.dart.textual_outline_modelled.expect @@ -0,0 +1,10 @@ +class A { + void foo() {} +} +class B implements A { + @override + void foo([int i = 0]) {} +} +extension type ET1(B b) implements A {} +extension type ET2(B b) implements ET1, B {} +void main() {} diff --git a/pkg/front_end/testcases/extension_types/issue53740.dart.weak.expect b/pkg/front_end/testcases/extension_types/issue53740.dart.weak.expect new file mode 100644 index 00000000000..80dffe301f1 --- /dev/null +++ b/pkg/front_end/testcases/extension_types/issue53740.dart.weak.expect @@ -0,0 +1,48 @@ +library; +import self as self; +import "dart:core" as core; + +class A extends core::Object { + synthetic constructor •() → self::A + : super core::Object::•() + ; + method foo() → void {} +} +class B extends core::Object implements self::A { + synthetic constructor •() → self::B + : super core::Object::•() + ; + @#C1 + method foo([core::int i = #C2]) → void {} +} +extension type ET1(self::B b) implements self::A { + abstract extension-type-member representation-field get b() → self::B; + constructor • = self::ET1|constructor#; + constructor tearoff • = self::ET1|constructor#_#new#tearOff; +} +extension type ET2(self::B b) implements self::ET1 /* = self::B */, self::B { + abstract extension-type-member representation-field get b() → self::B; + constructor • = self::ET2|constructor#; + constructor tearoff • = self::ET2|constructor#_#new#tearOff; +} +static extension-type-member method ET1|constructor#(self::B b) → self::ET1 /* = self::B */ { + lowered final self::ET1 /* = self::B */ #this = b; + return #this; +} +static extension-type-member method ET1|constructor#_#new#tearOff(self::B b) → self::ET1 /* = self::B */ + return self::ET1|constructor#(b); +static extension-type-member method ET2|constructor#(self::B b) → self::ET2 /* = self::B */ { + lowered final self::ET2 /* = self::B */ #this = b; + return #this; +} +static extension-type-member method ET2|constructor#_#new#tearOff(self::B b) → self::ET2 /* = self::B */ + return self::ET2|constructor#(b); +static method main() → void { + self::ET2 /* = self::B */ et2 = self::ET2|constructor#(new self::B::•()); + et2.{self::B::foo}(42){([core::int]) → void}; +} + +constants { + #C1 = core::_Override {} + #C2 = 0 +} diff --git a/pkg/front_end/testcases/extension_types/issue53740.dart.weak.modular.expect b/pkg/front_end/testcases/extension_types/issue53740.dart.weak.modular.expect new file mode 100644 index 00000000000..80dffe301f1 --- /dev/null +++ b/pkg/front_end/testcases/extension_types/issue53740.dart.weak.modular.expect @@ -0,0 +1,48 @@ +library; +import self as self; +import "dart:core" as core; + +class A extends core::Object { + synthetic constructor •() → self::A + : super core::Object::•() + ; + method foo() → void {} +} +class B extends core::Object implements self::A { + synthetic constructor •() → self::B + : super core::Object::•() + ; + @#C1 + method foo([core::int i = #C2]) → void {} +} +extension type ET1(self::B b) implements self::A { + abstract extension-type-member representation-field get b() → self::B; + constructor • = self::ET1|constructor#; + constructor tearoff • = self::ET1|constructor#_#new#tearOff; +} +extension type ET2(self::B b) implements self::ET1 /* = self::B */, self::B { + abstract extension-type-member representation-field get b() → self::B; + constructor • = self::ET2|constructor#; + constructor tearoff • = self::ET2|constructor#_#new#tearOff; +} +static extension-type-member method ET1|constructor#(self::B b) → self::ET1 /* = self::B */ { + lowered final self::ET1 /* = self::B */ #this = b; + return #this; +} +static extension-type-member method ET1|constructor#_#new#tearOff(self::B b) → self::ET1 /* = self::B */ + return self::ET1|constructor#(b); +static extension-type-member method ET2|constructor#(self::B b) → self::ET2 /* = self::B */ { + lowered final self::ET2 /* = self::B */ #this = b; + return #this; +} +static extension-type-member method ET2|constructor#_#new#tearOff(self::B b) → self::ET2 /* = self::B */ + return self::ET2|constructor#(b); +static method main() → void { + self::ET2 /* = self::B */ et2 = self::ET2|constructor#(new self::B::•()); + et2.{self::B::foo}(42){([core::int]) → void}; +} + +constants { + #C1 = core::_Override {} + #C2 = 0 +} diff --git a/pkg/front_end/testcases/extension_types/issue53740.dart.weak.outline.expect b/pkg/front_end/testcases/extension_types/issue53740.dart.weak.outline.expect new file mode 100644 index 00000000000..557849e98ca --- /dev/null +++ b/pkg/front_end/testcases/extension_types/issue53740.dart.weak.outline.expect @@ -0,0 +1,42 @@ +library; +import self as self; +import "dart:core" as core; + +class A extends core::Object { + synthetic constructor •() → self::A + ; + method foo() → void + ; +} +class B extends core::Object implements self::A { + synthetic constructor •() → self::B + ; + @core::override + method foo([core::int i = 0]) → void + ; +} +extension type ET1(self::B b) implements self::A { + abstract extension-type-member representation-field get b() → self::B; + constructor • = self::ET1|constructor#; + constructor tearoff • = self::ET1|constructor#_#new#tearOff; +} +extension type ET2(self::B b) implements self::ET1 /* = self::B */, self::B { + abstract extension-type-member representation-field get b() → self::B; + constructor • = self::ET2|constructor#; + constructor tearoff • = self::ET2|constructor#_#new#tearOff; +} +static extension-type-member method ET1|constructor#(self::B b) → self::ET1 /* = self::B */ + ; +static extension-type-member method ET1|constructor#_#new#tearOff(self::B b) → self::ET1 /* = self::B */ + return self::ET1|constructor#(b); +static extension-type-member method ET2|constructor#(self::B b) → self::ET2 /* = self::B */ + ; +static extension-type-member method ET2|constructor#_#new#tearOff(self::B b) → self::ET2 /* = self::B */ + return self::ET2|constructor#(b); +static method main() → void + ; + + +Extra constant evaluation status: +Evaluated: StaticGet @ org-dartlang-testcase:///issue53740.dart:10:4 -> InstanceConstant(const _Override{}) +Extra constant evaluation: evaluated: 5, effectively constant: 1 diff --git a/pkg/front_end/testcases/extension_types/issue53740.dart.weak.transformed.expect b/pkg/front_end/testcases/extension_types/issue53740.dart.weak.transformed.expect new file mode 100644 index 00000000000..80dffe301f1 --- /dev/null +++ b/pkg/front_end/testcases/extension_types/issue53740.dart.weak.transformed.expect @@ -0,0 +1,48 @@ +library; +import self as self; +import "dart:core" as core; + +class A extends core::Object { + synthetic constructor •() → self::A + : super core::Object::•() + ; + method foo() → void {} +} +class B extends core::Object implements self::A { + synthetic constructor •() → self::B + : super core::Object::•() + ; + @#C1 + method foo([core::int i = #C2]) → void {} +} +extension type ET1(self::B b) implements self::A { + abstract extension-type-member representation-field get b() → self::B; + constructor • = self::ET1|constructor#; + constructor tearoff • = self::ET1|constructor#_#new#tearOff; +} +extension type ET2(self::B b) implements self::ET1 /* = self::B */, self::B { + abstract extension-type-member representation-field get b() → self::B; + constructor • = self::ET2|constructor#; + constructor tearoff • = self::ET2|constructor#_#new#tearOff; +} +static extension-type-member method ET1|constructor#(self::B b) → self::ET1 /* = self::B */ { + lowered final self::ET1 /* = self::B */ #this = b; + return #this; +} +static extension-type-member method ET1|constructor#_#new#tearOff(self::B b) → self::ET1 /* = self::B */ + return self::ET1|constructor#(b); +static extension-type-member method ET2|constructor#(self::B b) → self::ET2 /* = self::B */ { + lowered final self::ET2 /* = self::B */ #this = b; + return #this; +} +static extension-type-member method ET2|constructor#_#new#tearOff(self::B b) → self::ET2 /* = self::B */ + return self::ET2|constructor#(b); +static method main() → void { + self::ET2 /* = self::B */ et2 = self::ET2|constructor#(new self::B::•()); + et2.{self::B::foo}(42){([core::int]) → void}; +} + +constants { + #C1 = core::_Override {} + #C2 = 0 +}