[vm] Add recursive bounds mixin deduplication transformer test

TEST=pkg/vm/testcases/transformations/mixin_deduplication/generic_recursive_bounds.dart

Change-Id: I39ae0ab13ec171a161c74ea310437b5eae233616
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/356501
Reviewed-by: Slava Egorov <vegorov@google.com>
Commit-Queue: Martin Kustermann <kustermann@google.com>
This commit is contained in:
Martin Kustermann
2024-03-08 11:28:29 +00:00
committed by Commit Queue
parent dad57a4ced
commit 8d47263f60
2 changed files with 64 additions and 0 deletions
@@ -0,0 +1,17 @@
// Copyright (c) 2024, 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.
class B1<T> {}
mixin M1 {}
class SC1<A extends B, B extends List<A>> extends B1<A> with M1 {}
class SC2<A extends B, B extends List<A>> extends B1<A> with M1 {}
class SC3<A extends B, B extends List<A?>> extends B1<A> with M1 {}
class SC4<A extends B, B extends List<A>?> extends B1<A> with M1 {}
main() {}
@@ -0,0 +1,47 @@
library #lib;
import self as self;
import "dart:core" as core;
class B1<T extends core::Object? = dynamic> extends core::Object {
synthetic constructor •() → self::B1<self::B1::T%>
: super core::Object::•()
;
}
abstract class M1 extends core::Object /*isMixinDeclaration*/ {
}
abstract class _SC1&B1&M1<A extends self::_SC1&B1&M1::B = dynamic, B extends core::List<self::_SC1&B1&M1::A> = core::List<dynamic>> extends self::B1<self::_SC1&B1&M1::A> implements self::M1 /*isAnonymousMixin,isEliminatedMixin*/ {
synthetic constructor •() → self::_SC1&B1&M1<self::_SC1&B1&M1::A, self::_SC1&B1&M1::B>
: super self::B1::•()
;
}
class SC1<A extends self::SC1::B = dynamic, B extends core::List<self::SC1::A> = core::List<dynamic>> extends self::_SC1&B1&M1<self::SC1::A, self::SC1::B> {
synthetic constructor •() → self::SC1<self::SC1::A, self::SC1::B>
: super self::_SC1&B1&M1::•()
;
}
class SC2<A extends self::SC2::B = dynamic, B extends core::List<self::SC2::A> = core::List<dynamic>> extends self::_SC1&B1&M1<self::SC2::A, self::SC2::B> {
synthetic constructor •() → self::SC2<self::SC2::A, self::SC2::B>
: super self::_SC1&B1&M1::•()
;
}
abstract class _SC3&B1&M1<A extends self::_SC3&B1&M1::B = dynamic, B extends core::List<self::_SC3&B1&M1::A?> = core::List<dynamic>> extends self::B1<self::_SC3&B1&M1::A> implements self::M1 /*isAnonymousMixin,isEliminatedMixin*/ {
synthetic constructor •() → self::_SC3&B1&M1<self::_SC3&B1&M1::A, self::_SC3&B1&M1::B>
: super self::B1::•()
;
}
class SC3<A extends self::SC3::B = dynamic, B extends core::List<self::SC3::A?> = core::List<dynamic>> extends self::_SC3&B1&M1<self::SC3::A, self::SC3::B> {
synthetic constructor •() → self::SC3<self::SC3::A, self::SC3::B>
: super self::_SC3&B1&M1::•()
;
}
abstract class _SC4&B1&M1<A extends self::_SC4&B1&M1::B% = dynamic, B extends core::List<self::_SC4&B1&M1::A%>? = core::List<dynamic>?> extends self::B1<self::_SC4&B1&M1::A%> implements self::M1 /*isAnonymousMixin,isEliminatedMixin*/ {
synthetic constructor •() → self::_SC4&B1&M1<self::_SC4&B1&M1::A%, self::_SC4&B1&M1::B%>
: super self::B1::•()
;
}
class SC4<A extends self::SC4::B% = dynamic, B extends core::List<self::SC4::A%>? = core::List<dynamic>?> extends self::_SC4&B1&M1<self::SC4::A%, self::SC4::B%> {
synthetic constructor •() → self::SC4<self::SC4::A%, self::SC4::B%>
: super self::_SC4&B1&M1::•()
;
}
static method main() → dynamic {}