blob: 23d8fa3a8ac38e0851d17bb29aca2a85e29db33e [file] [log] [blame]
// Copyright (c) 2021, 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 For an expression of the form e<typeArgs>, which is not followed
/// by an argument list (that would turn it into a generic function invocation),
/// the meaning of e<typeArgs> depends on the expression e:
/// ...
/// - If e denotes a generic instance method (e has the form r.name and r has a
/// static type for which name is a generic interface method), then e<typeArgs>
/// performs an explicitly instantiated method tear-off, which works just like
/// the current implicitly instantiated method tear-off except that the types
/// are provided instead of inferred.
///
/// @description Checks that if e denotes a generic instance method then then
/// e<typeArgs> performs an explicitly instantiated method tear-off
/// @author sgrekhov@unipro.ru
// SharedOptions=--enable-experiment=constructor-tearoffs
import "../../Utils/expect.dart";
class C {
void foo1<X>(X x) {}
}
typedef CAlias = C;
main() {
var c1 = C().foo1<int>;
Expect.isFalse(c1 is Type);
Expect.isTrue(c1 is void Function(int));
Expect.runtimeIsNotType<Type>(c1);
Expect.runtimeIsType<void Function(int)>(c1);
var c2 = CAlias().foo1<String>;
Expect.isFalse(c2 is Type);
Expect.isTrue(c2 is void Function(String));
Expect.runtimeIsNotType<Type>(c2);
Expect.runtimeIsType<void Function(String)>(c2);
}