Fasta: Instance field cannot be const

Fixes #32326.

Change-Id: Idef32a842a68c5c9ee58caff7b6e731204f033b6
Reviewed-on: https://dart-review.googlesource.com/72041
Commit-Queue: Jens Johansen <jensj@google.com>
Reviewed-by: Peter von der Ahé <ahe@google.com>
diff --git a/pkg/front_end/lib/src/fasta/fasta_codes_generated.dart b/pkg/front_end/lib/src/fasta/fasta_codes_generated.dart
index 7348050..dbaa982 100644
--- a/pkg/front_end/lib/src/fasta/fasta_codes_generated.dart
+++ b/pkg/front_end/lib/src/fasta/fasta_codes_generated.dart
@@ -1375,6 +1375,17 @@
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Null> codeConstInstanceField = messageConstInstanceField;
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const MessageCode messageConstInstanceField = const MessageCode(
+    "ConstInstanceField",
+    analyzerCode: "CONST_INSTANCE_FIELD",
+    message: r"""Only static fields can be declared as const.""",
+    tip:
+        r"""Try using 'final' instead of 'const', or adding the keyword 'static'.""");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeConstMethod = messageConstMethod;
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
diff --git a/pkg/front_end/lib/src/fasta/source/outline_builder.dart b/pkg/front_end/lib/src/fasta/source/outline_builder.dart
index 5d3c0e0..1bf6d19 100644
--- a/pkg/front_end/lib/src/fasta/source/outline_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/outline_builder.dart
@@ -21,6 +21,7 @@
         LocatedMessage,
         Message,
         messageConstConstructorWithBody,
+        messageConstInstanceField,
         messageConstMethod,
         messageConstructorWithReturnType,
         messageConstructorWithTypeParameters,
@@ -1180,6 +1181,13 @@
     int modifiers = (staticToken != null ? staticMask : 0) |
         (covariantToken != null ? covariantMask : 0) |
         Modifier.validateVarFinalOrConst(varFinalOrConst?.lexeme);
+    if (staticToken == null && modifiers & constMask != 0) {
+      // It is a compile-time error if an instance variable is declared to be
+      // constant.
+      addCompileTimeError(messageConstInstanceField, varFinalOrConst.charOffset,
+          varFinalOrConst.length);
+      modifiers &= ~constMask;
+    }
     List<MetadataBuilder> metadata = pop();
     Token metadataToken = pop();
     var docComment = documentationComment(beginToken, metadataToken);
diff --git a/pkg/front_end/messages.yaml b/pkg/front_end/messages.yaml
index 30dedfc..a11cd7f 100644
--- a/pkg/front_end/messages.yaml
+++ b/pkg/front_end/messages.yaml
@@ -461,8 +461,8 @@
   tip: "Try removing either the 'const' or 'final' keyword."
   analyzerCode: CONST_AND_FINAL
   script:
-    - "class C { const final int x = 5; }"
-    - "class C { final const int x = 5; }"
+    - "class C { static const final int x = 5; }"
+    - "class C { static final const int x = 5; }"
 
 ConstAndVar:
   template: "Members can't be declared to be both 'const' and 'var'."
@@ -2687,4 +2687,11 @@
     main() {
       Foo foo = new Foo();
       foo.f();
-    }
\ No newline at end of file
+    }
+
+ConstInstanceField:
+  template: "Only static fields can be declared as const."
+  tip: "Try using 'final' instead of 'const', or adding the keyword 'static'."
+  analyzerCode: CONST_INSTANCE_FIELD
+  script:
+    - "class C { const field = 0; }"
diff --git a/tests/co19/co19-kernel.status b/tests/co19/co19-kernel.status
index a30f7f5..594f662 100644
--- a/tests/co19/co19-kernel.status
+++ b/tests/co19/co19-kernel.status
@@ -196,7 +196,6 @@
 Language/Classes/Instance_Methods/override_subtype_t04: CompileTimeError
 Language/Classes/Instance_Methods/override_subtype_t05: CompileTimeError
 Language/Classes/Instance_Methods/override_subtype_t06: CompileTimeError
-Language/Classes/Instance_Variables/constant_t01: MissingCompileTimeError
 Language/Classes/Instance_Variables/definition_t03: CompileTimeError
 Language/Classes/Setters/name_t01: CompileTimeError
 Language/Classes/Setters/name_t05: CompileTimeError
@@ -1685,7 +1684,6 @@
 Language/Classes/Constructors/Generative_Constructors/superclass_constructor_t03: MissingCompileTimeError
 Language/Classes/Constructors/Generative_Constructors/superclass_constructor_t05: MissingCompileTimeError
 Language/Classes/Constructors/Generative_Constructors/superclass_constructor_t06: MissingCompileTimeError
-Language/Classes/Instance_Variables/constant_t01: MissingCompileTimeError
 Language/Classes/Static_Methods/declaration_t01: MissingCompileTimeError
 Language/Classes/Static_Methods/same_name_method_and_setter_t01: CompileTimeError # Invalid test, see #33237
 Language/Classes/Superclasses/wrong_superclass_t08: MissingCompileTimeError
diff --git a/tests/co19_2/co19_2-kernel.status b/tests/co19_2/co19_2-kernel.status
index 0248977..140c019 100644
--- a/tests/co19_2/co19_2-kernel.status
+++ b/tests/co19_2/co19_2-kernel.status
@@ -45,7 +45,6 @@
 Language/Classes/Instance_Methods/same_name_static_member_in_superclass_t06: MissingCompileTimeError # Legal, see #33235
 Language/Classes/Instance_Methods/same_name_static_member_in_superclass_t07: MissingCompileTimeError # Legal, see #33235
 Language/Classes/Instance_Methods/same_name_static_member_in_superclass_t09: MissingCompileTimeError # Legal, see #33235
-Language/Classes/Instance_Variables/constant_t01: MissingCompileTimeError # Issue 32326
 Language/Classes/Setters/instance_setter_t01: MissingCompileTimeError # Legal, see #33235
 Language/Classes/Setters/instance_setter_t02: MissingCompileTimeError # Legal, see #33235
 Language/Classes/Setters/instance_setter_t03: MissingCompileTimeError # Legal, see #33235
diff --git a/tests/language_2/language_2_kernel.status b/tests/language_2/language_2_kernel.status
index 6254225..ca5235e 100644
--- a/tests/language_2/language_2_kernel.status
+++ b/tests/language_2/language_2_kernel.status
@@ -211,7 +211,6 @@
 const_cast2_test/none: CompileTimeError # Issue 32517
 const_constructor_mixin3_test: CompileTimeError # Issue 33644.
 const_constructor_mixin_test: CompileTimeError # Issue 33644.
-const_instance_field_test/01: MissingCompileTimeError # Fasta bug: Const instance field. Issue 32326.
 const_types_test/34: MissingCompileTimeError # Issue 31590
 const_types_test/39: MissingCompileTimeError # Issue 31590
 cyclic_type_variable_test/01: MissingCompileTimeError # Issue 32989 (missing cycle check in bounds)
@@ -722,7 +721,6 @@
 vm/regress_28325_test: RuntimeError # No support for line numbers in stacktraces
 
 [ $compiler == dartkp && $mode == debug && $runtime == dart_precompiled && $strong ]
-const_instance_field_test/01: Crash # Issue 32326.
 external_test/13: Crash
 type_promotion_functions_test/05: Pass
 type_promotion_functions_test/06: Pass
@@ -1375,7 +1373,6 @@
 variable_shadow_class_test/01: MissingCompileTimeError
 
 [ $mode == debug && $runtime == vm && $strong && ($compiler == app_jitk || $compiler == dartk || $compiler == dartkb) ]
-const_instance_field_test/01: Crash # Issue 32326.
 deopt_inlined_function_lazy_test: Skip
 
 [ $mode == debug && $hot_reload && ($compiler == dartk || $compiler == dartkb) ]
diff --git a/tests/lib_2/lib_2_kernel.status b/tests/lib_2/lib_2_kernel.status
index 44bc1dd..7af501e 100644
--- a/tests/lib_2/lib_2_kernel.status
+++ b/tests/lib_2/lib_2_kernel.status
@@ -39,7 +39,6 @@
 mirrors/reflected_type_classes_test/03: MissingCompileTimeError
 mirrors/reflected_type_test/02: MissingCompileTimeError
 mirrors/reflected_type_test/03: MissingCompileTimeError
-mirrors/variable_is_const_test/01: MissingCompileTimeError
 
 [ $arch == simarm64 && $strong && ($compiler == dartk || $compiler == dartkb) ]
 isolate/mint_maker_test: Timeout # Please triage.
@@ -112,9 +111,6 @@
 [ $mode == debug && $hot_reload_rollback && ($compiler == dartk || $compiler == dartkb) ]
 isolate/message3_test/constList_identical: Skip # Timeout
 
-[ $mode == debug && $strong && ($compiler == dartk || $compiler == dartkb) ]
-mirrors/variable_is_const_test/01: Crash # Issue 32326
-
 [ $runtime == vm && $checked && $strong && ($compiler == dartk || $compiler == dartkb) ]
 mirrors/redirecting_factory_different_type_test/01: MissingCompileTimeError # Issue 28424
 mirrors/redirecting_factory_different_type_test/none: RuntimeError # Issue 28424