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