[wildcard-variables] Add a test on unnamed optional parameters with no default value.
Bug: https://github.com/dart-lang/language/issues/3807
Change-Id: Ibeb29d3702b74379b64e8965c3ef9709c7bf2f41
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/369780
Commit-Queue: Kallen Tu <kallentu@google.com>
Reviewed-by: Lasse Nielsen <lrn@google.com>
diff --git a/tests/language/wildcard_variables/unnamed_optional/unnamed_optional_error_test.dart b/tests/language/wildcard_variables/unnamed_optional/unnamed_optional_error_test.dart
new file mode 100644
index 0000000..02e81ed
--- /dev/null
+++ b/tests/language/wildcard_variables/unnamed_optional/unnamed_optional_error_test.dart
@@ -0,0 +1,65 @@
+// Copyright (c) 2024, 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.
+
+// Tests that we still need default values for `this._` and `super._` and that
+// we can't add default values to a `_` named parameter where you can't add
+// default values.
+
+// SharedOptions=--enable-experiment=wildcard-variables
+
+class SuperClass {
+ SuperClass([int _]);
+ // ^
+ // [analyzer] COMPILE_TIME_ERROR.MISSING_DEFAULT_VALUE_FOR_PARAMETER
+ // [cfe] The parameter '_' can't have a value of 'null' because of its type 'int', but the implicit default value is 'null'.
+ SuperClass.nullable([int? _]);
+}
+class SubClass extends SuperClass {
+ final int _;
+ SubClass([
+ this._,
+ // ^
+ // [analyzer] COMPILE_TIME_ERROR.MISSING_DEFAULT_VALUE_FOR_PARAMETER
+ // [cfe] The parameter '_' can't have a value of 'null' because of its type 'int', but the implicit default value is 'null'.
+ super._,
+ // ^
+ // [analyzer] COMPILE_TIME_ERROR.DUPLICATE_DEFINITION
+ // [analyzer] COMPILE_TIME_ERROR.MISSING_DEFAULT_VALUE_FOR_PARAMETER
+ // [cfe] Duplicated parameter name '_'.
+ // [cfe] The parameter '_' can't have a value of 'null' because of its type 'int', but the implicit default value is 'null'.
+ // [cfe] Type 'int' of the optional super-initializer parameter '_' doesn't allow 'null', but the parameter doesn't have a default value, and the default value can't be copied from the corresponding parameter of the super constructor.
+ ]);
+}
+class TypedSubClass extends SuperClass {
+ final int? _;
+ TypedSubClass([
+ int this._,
+ // ^
+ // [analyzer] COMPILE_TIME_ERROR.MISSING_DEFAULT_VALUE_FOR_PARAMETER
+ // [cfe] The parameter '_' can't have a value of 'null' because of its type 'int', but the implicit default value is 'null'.
+ int super._,
+ // ^
+ // [analyzer] COMPILE_TIME_ERROR.DUPLICATE_DEFINITION
+ // [analyzer] COMPILE_TIME_ERROR.MISSING_DEFAULT_VALUE_FOR_PARAMETER
+ // [cfe] Duplicated parameter name '_'.
+ // [cfe] The parameter '_' can't have a value of 'null' because of its type 'int', but the implicit default value is 'null'.
+ // [cfe] Type 'int' of the optional super-initializer parameter '_' doesn't allow 'null', but the parameter doesn't have a default value, and the default value can't be copied from the corresponding parameter of the super constructor.
+ ]) : super.nullable();
+}
+
+// Function type parameters cannot have default values.
+typedef F = void Function([int _ = 1]);
+// ^
+// [analyzer] SYNTACTIC_ERROR.DEFAULT_VALUE_IN_FUNCTION_TYPE
+// [cfe] Can't have a default value in a function type.
+
+// Redirecting factory constructors cannot have default values.
+class ReClass {
+ ReClass([int x = 0]);
+ factory ReClass.redir([int _ = 0]) = ReClass;
+ // ^
+ // [analyzer] COMPILE_TIME_ERROR.DEFAULT_VALUE_IN_REDIRECTING_FACTORY_CONSTRUCTOR
+ // ^
+ // [cfe] Can't have a default value here because any default values of 'ReClass' would be used instead.
+}
diff --git a/tests/language/wildcard_variables/unnamed_optional/unnamed_optional_no_default_test.dart b/tests/language/wildcard_variables/unnamed_optional/unnamed_optional_no_default_test.dart
new file mode 100644
index 0000000..98a8281
--- /dev/null
+++ b/tests/language/wildcard_variables/unnamed_optional/unnamed_optional_no_default_test.dart
@@ -0,0 +1,61 @@
+// Copyright (c) 2024, 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.
+
+// Unnamed optional parameters, which are not initializing or super parameters,
+// that have no default values, have no errors.
+
+// SharedOptions=--enable-experiment=wildcard-variables
+
+import 'package:expect/expect.dart';
+
+class C {
+ C([int _]) {}
+ C.otherParams([int _, bool x = false, bool _ = true]) {}
+ C.otherParams2([int _ = 1, bool x = false, bool _]) {}
+
+ int foo([int _]) => 1;
+ int foo2([bool x = false, bool _, int _]) => 1;
+ int foo3([bool? x, bool _ = false, int _]) => 1;
+ int foo4([int _, bool? x, bool _ = false]) => 1;
+
+ static int fn([int _]) => 1;
+ static int fn2([bool x = false, bool _, int _]) => 1;
+ static int fn3([bool? x, bool _ = false, int _]) => 1;
+ static int fn4([int _, bool? x, bool _ = false]) => 1;
+}
+
+int _([bool _]) => 1;
+int topFoo2([bool x = false, bool _, int _]) => 1;
+int topFoo3([bool? x, bool _ = false, int _]) => 1;
+int topFoo4([int _, bool? x, bool _ = false]) => 1;
+
+void main() {
+ Expect.equals(1, _());
+ Expect.equals(1, topFoo2());
+ Expect.equals(1, topFoo3());
+ Expect.equals(1, topFoo4());
+
+ int foo([int _]) => 1;
+ int foo2([bool x = false, bool _, int _]) => 1;
+ int foo3([bool? x, bool _ = false, int _]) => 1;
+ int foo4([int _, bool? x, bool _ = false]) => 1;
+ Expect.equals(1, foo());
+ Expect.equals(1, foo2());
+ Expect.equals(1, foo3());
+ Expect.equals(1, foo4());
+
+ var c = C();
+ Expect.equals(1, c.foo());
+ Expect.equals(1, c.foo2());
+ Expect.equals(1, c.foo3());
+ Expect.equals(1, c.foo4());
+
+ Expect.equals(1, C.otherParams().foo());
+ Expect.equals(1, C.otherParams2().foo());
+
+ Expect.equals(1, C.fn());
+ Expect.equals(1, C.fn2());
+ Expect.equals(1, C.fn3());
+ Expect.equals(1, C.fn4());
+}