[cfe] Report an error on 'var' before a super parameter
Part of https://github.com/dart-lang/sdk/issues/47525
Change-Id: I6f797231db362681c00a0fc5910a6d8b17960e1c
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/237691
Reviewed-by: Johnni Winther <johnniwinther@google.com>
Commit-Queue: Chloe Stefantsova <cstefantsova@google.com>
diff --git a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
index 9c32f4c..12c2c40 100644
--- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
@@ -4331,6 +4331,7 @@
push((covariantToken != null ? covariantMask : 0) |
(requiredToken != null ? requiredMask : 0) |
Modifier.validateVarFinalOrConst(varFinalOrConst?.lexeme));
+ push(varFinalOrConst ?? NullValue.Token);
}
@override
@@ -4363,6 +4364,13 @@
// `invalid-type`.
buildDartType(type, allowPotentiallyConstantType: false);
}
+ Token? varOrFinalOrConst = pop(NullValue.Token) as Token?;
+ if (superKeyword != null && varOrFinalOrConst != null) {
+ handleRecoverableError(
+ fasta.templateExtraneousModifier.withArguments(varOrFinalOrConst),
+ varOrFinalOrConst,
+ varOrFinalOrConst);
+ }
int modifiers = pop() as int;
if (inCatchClause) {
modifiers |= finalMask;
diff --git a/pkg/front_end/testcases/super_parameters/var_before_super.dart b/pkg/front_end/testcases/super_parameters/var_before_super.dart
new file mode 100644
index 0000000..fa8a129
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/var_before_super.dart
@@ -0,0 +1,13 @@
+// Copyright (c) 2022, 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.
+
+class A {
+ A(String x);
+}
+
+class B extends A {
+ B(var super.x);
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/super_parameters/var_before_super.dart.strong.expect b/pkg/front_end/testcases/super_parameters/var_before_super.dart.strong.expect
new file mode 100644
index 0000000..f804642
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/var_before_super.dart.strong.expect
@@ -0,0 +1,23 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/super_parameters/var_before_super.dart:10:5: Error: Can't have modifier 'var' here.
+// Try removing 'var'.
+// B(var super.x);
+// ^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+ constructor •(core::String x) → self::A
+ : super core::Object::•()
+ ;
+}
+class B extends self::A {
+ constructor •(core::String x) → self::B
+ : super self::A::•(x)
+ ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/super_parameters/var_before_super.dart.strong.transformed.expect b/pkg/front_end/testcases/super_parameters/var_before_super.dart.strong.transformed.expect
new file mode 100644
index 0000000..f804642
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/var_before_super.dart.strong.transformed.expect
@@ -0,0 +1,23 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/super_parameters/var_before_super.dart:10:5: Error: Can't have modifier 'var' here.
+// Try removing 'var'.
+// B(var super.x);
+// ^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+ constructor •(core::String x) → self::A
+ : super core::Object::•()
+ ;
+}
+class B extends self::A {
+ constructor •(core::String x) → self::B
+ : super self::A::•(x)
+ ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/super_parameters/var_before_super.dart.textual_outline.expect b/pkg/front_end/testcases/super_parameters/var_before_super.dart.textual_outline.expect
new file mode 100644
index 0000000..6057c59
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/var_before_super.dart.textual_outline.expect
@@ -0,0 +1,7 @@
+class A {
+ A(String x);
+}
+class B extends A {
+ B(var super.x);
+}
+main() {}
diff --git a/pkg/front_end/testcases/super_parameters/var_before_super.dart.weak.expect b/pkg/front_end/testcases/super_parameters/var_before_super.dart.weak.expect
new file mode 100644
index 0000000..f804642
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/var_before_super.dart.weak.expect
@@ -0,0 +1,23 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/super_parameters/var_before_super.dart:10:5: Error: Can't have modifier 'var' here.
+// Try removing 'var'.
+// B(var super.x);
+// ^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+ constructor •(core::String x) → self::A
+ : super core::Object::•()
+ ;
+}
+class B extends self::A {
+ constructor •(core::String x) → self::B
+ : super self::A::•(x)
+ ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/super_parameters/var_before_super.dart.weak.modular.expect b/pkg/front_end/testcases/super_parameters/var_before_super.dart.weak.modular.expect
new file mode 100644
index 0000000..f804642
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/var_before_super.dart.weak.modular.expect
@@ -0,0 +1,23 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/super_parameters/var_before_super.dart:10:5: Error: Can't have modifier 'var' here.
+// Try removing 'var'.
+// B(var super.x);
+// ^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+ constructor •(core::String x) → self::A
+ : super core::Object::•()
+ ;
+}
+class B extends self::A {
+ constructor •(core::String x) → self::B
+ : super self::A::•(x)
+ ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/super_parameters/var_before_super.dart.weak.outline.expect b/pkg/front_end/testcases/super_parameters/var_before_super.dart.weak.outline.expect
new file mode 100644
index 0000000..18e4945
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/var_before_super.dart.weak.outline.expect
@@ -0,0 +1,14 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+ constructor •(core::String x) → self::A
+ ;
+}
+class B extends self::A {
+ constructor •(core::String x) → self::B
+ ;
+}
+static method main() → dynamic
+ ;
diff --git a/pkg/front_end/testcases/super_parameters/var_before_super.dart.weak.transformed.expect b/pkg/front_end/testcases/super_parameters/var_before_super.dart.weak.transformed.expect
new file mode 100644
index 0000000..f804642
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/var_before_super.dart.weak.transformed.expect
@@ -0,0 +1,23 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/super_parameters/var_before_super.dart:10:5: Error: Can't have modifier 'var' here.
+// Try removing 'var'.
+// B(var super.x);
+// ^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+ constructor •(core::String x) → self::A
+ : super core::Object::•()
+ ;
+}
+class B extends self::A {
+ constructor •(core::String x) → self::B
+ : super self::A::•(x)
+ ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/textual_outline.status b/pkg/front_end/testcases/textual_outline.status
index 900255e..399a2c7 100644
--- a/pkg/front_end/testcases/textual_outline.status
+++ b/pkg/front_end/testcases/textual_outline.status
@@ -58,8 +58,8 @@
general/constants/non_const_constructor: FormatterCrash
general/constants/number_folds: FormatterCrash
general/constants/number_folds_opt_out: FormatterCrash
-general/constants/various: FormatterCrash
general/constants/various2: FormatterCrash
+general/constants/various: FormatterCrash
general/constructor_initializer_invalid: FormatterCrash
general/covariant_generic2: FormatterCrash
general/duplicated_declarations: FormatterCrash
@@ -98,8 +98,8 @@
general/issue48487b: FormatterCrash
general/issue_46886: FormatterCrash
general/macro_class: FormatterCrash
-general/many_errors: FormatterCrash
general/many_errors2: FormatterCrash
+general/many_errors: FormatterCrash
general/missing_prefix_name: FormatterCrash
general/mixin_inherited_setter_for_mixed_in_field2: FormatterCrash
general/new_as_selector: FormatterCrash
@@ -216,6 +216,7 @@
regress/issue_41265.crash: FormatterCrash
super_parameters/issue47741: FormatterCrash
super_parameters/issue47922: FormatterCrash
+super_parameters/var_before_super: FormatterCrash
triple_shift/invalid_operator: FormatterCrash
variance/class_type_parameter_modifier: FormatterCrash
variance/generic_covariance_sound_variance: FormatterCrash