[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