| // Copyright (c) 2019, 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. |
| |
| /** |
| * Types of members from super-bounded class types are computed using the same |
| * rules as types of members from other types. Types of function applications |
| * involving super-bounded types are computed using the same rules as types of |
| * function applications involving other types. Here is an example: |
| * class A<X extends num> { |
| * X x; |
| * } |
| * A<Object> a; |
| * With this, [a.x] has static type Object, even though the upper bound on |
| * the type variable X is num. |
| * @description Checks that example from the Spec works correctly. |
| * @Issue 36959, 42415 |
| * @author iarkh@unipro.ru |
| */ |
| |
| class A<X extends num> { |
| X? x; |
| } |
| |
| A? a1; |
| A<dynamic>? a2; |
| A<Object?>? a3; |
| A<void>? a4; |
| |
| main() { |
| A a1; |
| A<dynamic> a2; |
| A<Object?> a3; |
| A<void> a4; |
| } |