| // 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. |
| |
| /** |
| * @assertion It is permitted to invoke or tear-off a method, setter, getter, or |
| * operator that is defined on Object on potentially nullable type. The type |
| * used for static analysis of such an invocation or tear-off shall be the type |
| * declared on the relevant member on Object. For example, given a receiver o of |
| * type T?, invoking an Object member on o shall use the type of the member as |
| * declared on Object, regardless of the type of the member as declared on T ( |
| * note that the type as declared on T must be a subtype of the type on Object, |
| * and so choosing the Object type is a sound choice. The opposite choice is not |
| * sound). |
| * |
| * @description Checks that it is permitted to invoke or tear-off a method, |
| * setter, getter, or operator that is defined on Object on potentially nullable |
| * type. The type used for static analysis of such an invocation or tear-off |
| * shall be the type declared on the relevant member on Object. |
| * @issue 41282 |
| * @author sgrekhov@unipro.ru |
| */ |
| |
| class T extends Type {} |
| |
| class C { |
| T get runtimeType => new T(); |
| } |
| |
| main() { |
| C c1 = new C(); |
| T t1 = c1.runtimeType; |
| |
| var c2 = new C() as C?; |
| T t2 = c2.runtimeType; |
| // ^^ |
| // [analyzer] unspecified |
| // [cfe] unspecified |
| } |