Fixes #1182. Add tests for f<int>.toString()
diff --git a/LanguageFeatures/Constructor-tear-offs/object_member_A01_t01.dart b/LanguageFeatures/Constructor-tear-offs/object_member_A01_t01.dart
new file mode 100644
index 0000000..7f1e446
--- /dev/null
+++ b/LanguageFeatures/Constructor-tear-offs/object_member_A01_t01.dart
@@ -0,0 +1,24 @@
+// 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 When f is an expression whose static type is a generic function
+/// type, and f<int> is an explicit generic function instantiation that is not a
+/// compile-time error, expressions like f<int>.m() and f<int>.m can be used to
+/// invoke or tear off members of the given function object (that is, members of
+/// Object, plus the given call method, plus any applicable extension methods).
+///
+/// @description Checks that if f<int> is an explicit generic function
+/// instantiation that is not a compile-time error, expressions like f<int>.m()
+/// @author sgrekhov@unipro.ru
+
+// SharedOptions=--enable-experiment=constructor-tearoffs
+import "../../Utils/expect.dart";
+
+T f<T>(T t) => t;
+
+main() {
+  var v = f<int>;
+  Expect.equals(v.toString(), f<int>.toString());
+  Expect.equals(v.call(42), f<int>.call(42));
+}
diff --git a/LanguageFeatures/Constructor-tear-offs/object_member_A01_t02.dart b/LanguageFeatures/Constructor-tear-offs/object_member_A01_t02.dart
new file mode 100644
index 0000000..6966db2
--- /dev/null
+++ b/LanguageFeatures/Constructor-tear-offs/object_member_A01_t02.dart
@@ -0,0 +1,26 @@
+// 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 When f is an expression whose static type is a generic function
+/// type, and f<int> is an explicit generic function instantiation that is not a
+/// compile-time error, expressions like f<int>.m() and f<int>.m can be used to
+/// invoke or tear off members of the given function object (that is, members of
+/// Object, plus the given call method, plus any applicable extension methods).
+///
+/// @description Checks that if f<int> is an explicit generic function
+/// instantiation that is not a compile-time error, expressions like f<int>.m
+/// @author sgrekhov@unipro.ru
+
+// SharedOptions=--enable-experiment=constructor-tearoffs
+import "../../Utils/expect.dart";
+
+T f<T>(T t) => t;
+
+main() {
+  var v = f<int>;
+  Expect.equals(v.toString, f<int>.toString);
+  Expect.equals(v.hashCode, f<int>.hashCode);
+  Expect.equals(v.runtimeType, f<int>.runtimeType);
+  Expect.equals(v.call, f<int>.call);
+}
diff --git a/LanguageFeatures/Constructor-tear-offs/object_member_A02_t01.dart b/LanguageFeatures/Constructor-tear-offs/object_member_A02_t01.dart
new file mode 100644
index 0000000..b89082b
--- /dev/null
+++ b/LanguageFeatures/Constructor-tear-offs/object_member_A02_t01.dart
@@ -0,0 +1,43 @@
+// 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 When C is a type literal, C<int> is regular-bounded parameterized
+/// type, and C.m is the name of a constructor, an expression of the form
+/// C<int>.m(...) denotes an instance creation and C<int>.m denotes a
+/// constructor tearoff, and they are not errors. When C.m is not a constructor
+/// name, those forms are a compile-time error, even in the case where Type has
+/// a member named m (for instance, C<int>.toString() is an error unless
+/// C.toString is a constructor).
+///
+/// @description Checks that if C is a type literal, C<int> is regular-bounded
+/// parameterized type, and C.m is not a constructor name, those forms are a
+/// compile-time error, even in the case where Type has a member named m
+/// @author sgrekhov@unipro.ru
+
+// SharedOptions=--enable-experiment=constructor-tearoffs
+
+class C<T> {
+}
+
+main() {
+  C<int>.toString();
+//       ^^^^^^^^
+// [analyzer] unspecified
+// [cfe] uncpecified
+
+  C.toString();
+//  ^^^^^^^^
+// [analyzer] unspecified
+// [cfe] uncpecified
+
+  C<int>.toString;
+//       ^^^^^^^^
+// [analyzer] unspecified
+// [cfe] uncpecified
+
+  C.toString;
+//  ^^^^^^^^
+// [analyzer] unspecified
+// [cfe] uncpecified
+}
diff --git a/LanguageFeatures/Constructor-tear-offs/object_member_A02_t02.dart b/LanguageFeatures/Constructor-tear-offs/object_member_A02_t02.dart
new file mode 100644
index 0000000..04e83c0
--- /dev/null
+++ b/LanguageFeatures/Constructor-tear-offs/object_member_A02_t02.dart
@@ -0,0 +1,31 @@
+// 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 When C is a type literal, C<int> is regular-bounded parameterized
+/// type, and C.m is the name of a constructor, an expression of the form
+/// C<int>.m(...) denotes an instance creation and C<int>.m denotes a
+/// constructor tearoff, and they are not errors. When C.m is not a constructor
+/// name, those forms are a compile-time error, even in the case where Type has
+/// a member named m (for instance, C<int>.toString() is an error unless
+/// C.toString is a constructor).
+///
+/// @description Checks that if C is a type literal, C<int> is regular-bounded
+/// parameterized type, and C.m is a constructor name, those forms are not a
+/// compile-time error, even in the case where Type has a member named m
+/// @author sgrekhov@unipro.ru
+
+// SharedOptions=--enable-experiment=constructor-tearoffs
+
+import "../../Utils/expect.dart";
+
+class C<T> {
+  C.toString() {}
+}
+
+main() {
+  Expect.isTrue(C<int>.toString() is C);
+  Expect.isTrue(C.toString() is C);
+  Expect.isTrue(C<int>.toString is Function);
+  Expect.isTrue(C.toString is Function);
+}
diff --git a/LanguageFeatures/Constructor-tear-offs/object_member_A02_t03.dart b/LanguageFeatures/Constructor-tear-offs/object_member_A02_t03.dart
new file mode 100644
index 0000000..7e686f2
--- /dev/null
+++ b/LanguageFeatures/Constructor-tear-offs/object_member_A02_t03.dart
@@ -0,0 +1,33 @@
+// 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 When C is a type literal, C<int> is regular-bounded parameterized
+/// type, and C.m is the name of a constructor, an expression of the form
+/// C<int>.m(...) denotes an instance creation and C<int>.m denotes a
+/// constructor tearoff, and they are not errors. When C.m is not a constructor
+/// name, those forms are a compile-time error, even in the case where Type has
+/// a member named m (for instance, C<int>.toString() is an error unless
+/// C.toString is a constructor).
+///
+/// @description Checks that if C is a type literal, C<int> is regular-bounded
+/// parameterized type, and C.m is not a constructor name, those forms are a
+/// compile-time error, even in the case where Type has a member named m
+/// @author sgrekhov@unipro.ru
+
+// SharedOptions=--enable-experiment=constructor-tearoffs
+
+import "../../Utils/expect.dart";
+
+class C<T> {
+}
+
+main() {
+  var v1 = C<int>;
+  Expect.isTrue(v1.toString() is String);
+  Expect.isTrue(v1.toString is Function);
+
+  var v2 = C;
+  Expect.isTrue(v2.toString() is String);
+  Expect.isTrue(v2.toString is Function);
+}