Fix crash when const initializer is not assignable to the const variable.

R=brianwilkerson@google.com, paulberry@google.com

Change-Id: I6f1f803a82e5fc04a934d5e586b973d986f1df35
Reviewed-on: https://dart-review.googlesource.com/63446
Reviewed-by: Paul Berry <paulberry@google.com>
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
diff --git a/pkg/analyzer/lib/src/kernel/resynthesize.dart b/pkg/analyzer/lib/src/kernel/resynthesize.dart
index a2a8be8..d3bf1e4 100644
--- a/pkg/analyzer/lib/src/kernel/resynthesize.dart
+++ b/pkg/analyzer/lib/src/kernel/resynthesize.dart
@@ -556,12 +556,14 @@
       return AstTestFactory.mapLiteral(keyword, typeArguments, entries);
     }
 
-    // Invalid annotations are represented as Let.
+    // Invalid initializers and  annotations are represented as Let.
     if (expr is kernel.Let) {
-      kernel.Let let = expr;
-      if (_isStaticError(let.variable.initializer) ||
-          _isStaticError(let.body)) {
-        throw const _CompilationErrorFound();
+      var body = expr.body;
+      if (body is kernel.Let) {
+        var initializer = body.variable.initializer;
+        if (initializer is kernel.Let && _isStaticError(initializer.body)) {
+          throw const _CompilationErrorFound();
+        }
       }
     }
 
diff --git a/pkg/analyzer/test/generated/checked_mode_compile_time_error_code_kernel_test.dart b/pkg/analyzer/test/generated/checked_mode_compile_time_error_code_kernel_test.dart
index 171376f..6cd4ceb 100644
--- a/pkg/analyzer/test/generated/checked_mode_compile_time_error_code_kernel_test.dart
+++ b/pkg/analyzer/test/generated/checked_mode_compile_time_error_code_kernel_test.dart
@@ -149,13 +149,6 @@
 
   @failingTest
   @override
-  test_fieldTypeOk_generic() async {
-    // UnimplementedError: kernel: (Let) let final dynamic #t4 = #lib2::y in let ...
-    await super.test_fieldTypeOk_generic();
-  }
-
-  @failingTest
-  @override
   test_fieldTypeOk_unresolved_null() async {
     // UnimplementedError: kernel: (AsExpression) x as{TypeError} invalid-type
     await super.test_fieldTypeOk_unresolved_null();
diff --git a/pkg/analyzer/test/generated/static_type_warning_code_kernel_test.dart b/pkg/analyzer/test/generated/static_type_warning_code_kernel_test.dart
index 7b814d5..732c694 100644
--- a/pkg/analyzer/test/generated/static_type_warning_code_kernel_test.dart
+++ b/pkg/analyzer/test/generated/static_type_warning_code_kernel_test.dart
@@ -254,20 +254,6 @@
 
   @override
   @failingTest
-  test_invalidAssignment_defaultValue_named() async {
-    // UnimplementedError: kernel: (Let) let final dynamic #t1 = 0 in let ...
-    await super.test_invalidAssignment_defaultValue_named();
-  }
-
-  @override
-  @failingTest
-  test_invalidAssignment_defaultValue_optional() async {
-    // UnimplementedError: kernel: (Let) let final dynamic #t2 = 0 in let ...
-    await super.test_invalidAssignment_defaultValue_optional();
-  }
-
-  @override
-  @failingTest
   test_invalidAssignment_dynamic() async {
     // Bad state: No reference information for dynamic at 11
     await super.test_invalidAssignment_dynamic();
diff --git a/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart b/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart
index b88ac9c..aff06a8 100644
--- a/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart
@@ -2909,6 +2909,68 @@
     }
   }
 
+  test_invalid_assignment_types_local() async {
+    addTestFile(r'''
+int a;
+bool b;
+main() {
+  a = b;
+}
+''');
+    await resolveTestFile();
+    expect(result.errors, isNotEmpty);
+
+    var assignment = findNode.assignment('a = b');
+    assertElementNull(assignment);
+    assertType(assignment, 'bool');
+
+    SimpleIdentifier aRef = assignment.leftHandSide;
+    assertElement(aRef, findElement.topVar('a').setter);
+    assertType(aRef, 'int');
+
+    SimpleIdentifier bRef = assignment.rightHandSide;
+    assertElement(bRef, findElement.topVar('b').getter);
+    assertType(bRef, 'bool');
+  }
+
+  test_invalid_assignment_types_top() async {
+    addTestFile(r'''
+int a = 0;
+bool b = a;
+''');
+    await resolveTestFile();
+    expect(result.errors, isNotEmpty);
+
+    var bDeclaration = findNode.variableDeclaration('b =');
+    TopLevelVariableElement bElement = bDeclaration.element;
+    assertElement(bDeclaration.name, bElement);
+    assertType(bDeclaration.name, 'bool');
+    expect(bElement.type.toString(), 'bool');
+
+    SimpleIdentifier aRef = bDeclaration.initializer;
+    assertElement(aRef, findElement.topGet('a'));
+    assertType(aRef, 'int');
+  }
+
+  test_invalid_assignment_types_top_const() async {
+    addTestFile(r'''
+const int a = 0;
+const bool b = a;
+''');
+    await resolveTestFile();
+    expect(result.errors, isNotEmpty);
+
+    var bDeclaration = findNode.variableDeclaration('b =');
+    TopLevelVariableElement bElement = bDeclaration.element;
+    assertElement(bDeclaration.name, bElement);
+    assertType(bDeclaration.name, 'bool');
+    expect(bElement.type.toString(), 'bool');
+
+    SimpleIdentifier aRef = bDeclaration.initializer;
+    assertElement(aRef, findElement.topGet('a'));
+    assertType(aRef, 'int');
+  }
+
   test_invalid_methodInvocation_simpleIdentifier() async {
     addTestFile(r'''
 int foo = 0;
@@ -7545,6 +7607,10 @@
     return _node(search);
   }
 
+  VariableDeclaration variableDeclaration(String search) {
+    return _node(search).getAncestor((n) => n is VariableDeclaration);
+  }
+
   AstNode _node(String search) {
     var content = result.content;
     var index = content.indexOf(search);
diff --git a/pkg/analyzer/test/src/summary/resynthesize_common.dart b/pkg/analyzer/test/src/summary/resynthesize_common.dart
index 2b06205..251e729 100644
--- a/pkg/analyzer/test/src/summary/resynthesize_common.dart
+++ b/pkg/analyzer/test/src/summary/resynthesize_common.dart
@@ -2624,6 +2624,25 @@
     }
   }
 
+  test_const_invalid_typeMismatch() async {
+    var library = await checkLibrary(r'''
+const int a = 0;
+const bool b = a + 5;
+''', allowErrors: true);
+    if (isSharedFrontEnd) {
+      checkElementText(library, r'''
+const int a = 0;
+const bool b = #invalidConst;
+''');
+    } else {
+      checkElementText(library, r'''
+const int a = 0;
+const bool b =
+        a/*location: test.dart;a?*/ + 5;
+''');
+    }
+  }
+
   test_const_invokeConstructor_generic_named() async {
     var library = await checkLibrary(r'''
 class C<K, V> {
@@ -7503,24 +7522,6 @@
     }
   }
 
-  test_instantiateToBounds_functionTypeAlias_simple() async {
-    var library = await checkLibrary('''
-typedef F<T extends num>(T p);
-F f;
-''');
-    if (isStrongMode) {
-      checkElementText(library, r'''
-typedef F<T extends num> = dynamic Function(T p);
-(num) → dynamic f;
-''');
-    } else {
-      checkElementText(library, r'''
-typedef F<T extends num> = dynamic Function(T p);
-(dynamic) → dynamic f;
-''');
-    }
-  }
-
   test_instantiateToBounds_functionTypeAlias_reexported() async {
     addLibrarySource('/a.dart', r'''
 class O {}
@@ -7552,6 +7553,24 @@
     }
   }
 
+  test_instantiateToBounds_functionTypeAlias_simple() async {
+    var library = await checkLibrary('''
+typedef F<T extends num>(T p);
+F f;
+''');
+    if (isStrongMode) {
+      checkElementText(library, r'''
+typedef F<T extends num> = dynamic Function(T p);
+(num) → dynamic f;
+''');
+    } else {
+      checkElementText(library, r'''
+typedef F<T extends num> = dynamic Function(T p);
+(dynamic) → dynamic f;
+''');
+    }
+  }
+
   test_instantiateToBounds_simple() async {
     var library = await checkLibrary('''
 class C<T extends num> {}
diff --git a/pkg/analyzer/test/src/summary/resynthesize_kernel_test.dart b/pkg/analyzer/test/src/summary/resynthesize_kernel_test.dart
index 2f23c79..86116af 100644
--- a/pkg/analyzer/test/src/summary/resynthesize_kernel_test.dart
+++ b/pkg/analyzer/test/src/summary/resynthesize_kernel_test.dart
@@ -185,18 +185,6 @@
     await super.test_import_invalidUri_metadata();
   }
 
-  @override
-  @failingTest
-  test_invalid_annotation_prefixed_constructor() {
-    return super.test_invalid_annotation_prefixed_constructor();
-  }
-
-  @override
-  @failingTest
-  test_invalid_annotation_unprefixed_constructor() {
-    return super.test_invalid_annotation_unprefixed_constructor();
-  }
-
   @failingTest
   @FastaProblem('https://github.com/dart-lang/sdk/issues/30267')
   test_invalid_nameConflict_imported() async {
@@ -258,24 +246,6 @@
     await super.test_unresolved_annotation_instanceCreation_argument_super();
   }
 
-  @override
-  @failingTest
-  test_unresolved_annotation_prefixedIdentifier_badPrefix() {
-    return super.test_unresolved_annotation_prefixedIdentifier_badPrefix();
-  }
-
-  @override
-  @failingTest
-  test_unresolved_annotation_prefixedIdentifier_noDeclaration() {
-    return super.test_unresolved_annotation_prefixedIdentifier_noDeclaration();
-  }
-
-  @override
-  @failingTest
-  test_unresolved_annotation_simpleIdentifier() {
-    return super.test_unresolved_annotation_simpleIdentifier();
-  }
-
   Future<KernelResynthesizer> _createResynthesizer(Uri testUri) async {
     var logger = new PerformanceLog(null);
     var byteStore = new MemoryByteStore();