| library; |
| // |
| // Problems in library: |
| // |
| // pkg/front_end/testcases/extension_types/issue53123.dart:7:6: Error: Inferred type argument 'V<dynamic>' doesn't conform to the bound 'V<T>' of the type variable 'T' on 'ExtensionType(V<V<dynamic>>)'. |
| // Try specifying type arguments explicitly so that they conform to the bounds. |
| // test(V v) { |
| // ^ |
| // pkg/front_end/testcases/extension_types/issue53123.dart:5:18: Context: This is the type variable whose bound isn't conformed to. |
| // extension type V<T extends V<T>>(T id) {} |
| // ^ |
| // |
| // pkg/front_end/testcases/extension_types/issue53123.dart:8:8: Error: Inferred type argument 'V<dynamic>' doesn't conform to the bound 'V<T>' of the type variable 'T' on 'ExtensionType(V<V<dynamic>>)'. |
| // Try specifying type arguments explicitly so that they conform to the bounds. |
| // List<V> l = [v]; |
| // ^ |
| // pkg/front_end/testcases/extension_types/issue53123.dart:5:18: Context: This is the type variable whose bound isn't conformed to. |
| // extension type V<T extends V<T>>(T id) {} |
| // ^ |
| // |
| import self as self; |
| import "dart:core" as core; |
| |
| extension type V<T extends self::V<T%> /* = T% */ = self::V<dynamic> /* = dynamic */>(T% id) { |
| abstract extension-type-member representation-field get id() → T%; |
| constructor • = self::V|constructor#; |
| constructor tearoff • = self::V|constructor#_#new#tearOff; |
| } |
| static extension-type-member method V|constructor#<T extends self::V<self::V|constructor#::T%> /* = self::V|constructor#::T% */ = self::V<dynamic> /* = dynamic */>(self::V|constructor#::T% id) → self::V<self::V|constructor#::T%> /* = self::V|constructor#::T% */ { |
| lowered final self::V<self::V|constructor#::T%> /* = self::V|constructor#::T% */ #this = id; |
| return #this; |
| } |
| static extension-type-member method V|constructor#_#new#tearOff<T extends self::V<self::V|constructor#_#new#tearOff::T%>% /* = self::V|constructor#_#new#tearOff::T% */ = self::V<dynamic> /* = dynamic */>(self::V|constructor#_#new#tearOff::T% id) → self::V<self::V|constructor#_#new#tearOff::T%>% /* = self::V|constructor#_#new#tearOff::T% */ |
| return self::V|constructor#<self::V|constructor#_#new#tearOff::T%>(id); |
| static method test(self::V<self::V<dynamic> /* = dynamic */> /* = dynamic */ v) → dynamic { |
| core::List<self::V<self::V<dynamic> /* = dynamic */> /* = dynamic */> l = <self::V<self::V<dynamic> /* = dynamic */> /* = dynamic */>[v]; |
| } |