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();