Report CONST_CONSTRUCTOR_WITH_NON_FINAL_FIELD for generative const constructors.

...and don't report for const factory redirecting constructors.

Bug: https://github.com/dart-lang/sdk/issues/46985
Change-Id: I4be654eaa923865de2372779f2ddf880ee98edcc
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/211162
Reviewed-by: Samuel Rawlins <srawlins@google.com>
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
diff --git a/pkg/analyzer/lib/src/generated/error_verifier.dart b/pkg/analyzer/lib/src/generated/error_verifier.dart
index 61462f2..80e0fb6 100644
--- a/pkg/analyzer/lib/src/generated/error_verifier.dart
+++ b/pkg/analyzer/lib/src/generated/error_verifier.dart
@@ -1949,6 +1949,9 @@
     if (!_enclosingExecutable.isConstConstructor) {
       return;
     }
+    if (!_enclosingExecutable.isGenerativeConstructor) {
+      return;
+    }
     // check if there is non-final field
     ClassElement classElement = constructorElement.enclosingElement;
     if (!classElement.hasNonFinalField) {
diff --git a/pkg/analyzer/test/src/diagnostics/const_constructor_with_non_final_field_test.dart b/pkg/analyzer/test/src/diagnostics/const_constructor_with_non_final_field_test.dart
index 0b5cf6e..36adecf 100644
--- a/pkg/analyzer/test/src/diagnostics/const_constructor_with_non_final_field_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/const_constructor_with_non_final_field_test.dart
@@ -15,7 +15,37 @@
 
 @reflectiveTest
 class ConstConstructorWithNonFinalFieldTest extends PubPackageResolutionTest {
-  test_this_named() async {
+  test_constFactoryNamed_hasNonFinal_redirect() async {
+    await assertNoErrorsInCode(r'''
+class A {
+  int x = 0;
+  const factory A.a() = B;
+}
+
+class B implements A {
+  const B();
+  int get x => 0;
+  void set x(_) {}
+}
+''');
+  }
+
+  test_constFactoryUnnamed_hasNonFinal_redirect() async {
+    await assertNoErrorsInCode(r'''
+class A {
+  int x = 0;
+  const factory A() = B;
+}
+
+class B implements A {
+  const B();
+  int get x => 0;
+  void set x(_) {}
+}
+''');
+  }
+
+  test_constGenerativeNamed_hasNonFinal() async {
     await assertErrorsInCode(r'''
 class A {
   int x = 0;
@@ -26,7 +56,7 @@
     ]);
   }
 
-  test_this_unnamed() async {
+  test_constGenerativeUnnamed_hasNonFinal() async {
     await assertErrorsInCode(r'''
 class A {
   int x = 0;