| Index: dart/sdk/lib/_internal/compiler/implementation/compile_time_constants.dart
|
| ===================================================================
|
| --- dart/sdk/lib/_internal/compiler/implementation/compile_time_constants.dart (revision 29908)
|
| +++ dart/sdk/lib/_internal/compiler/implementation/compile_time_constants.dart (working copy)
|
| @@ -114,21 +114,33 @@
|
| Node right = assignment.arguments.head;
|
| value =
|
| compileNodeWithDefinitions(right, definitions, isConst: isConst);
|
| - if (compiler.enableTypeAssertions
|
| - && value != null
|
| - && element.isField()) {
|
| + if (compiler.enableTypeAssertions &&
|
| + value != null &&
|
| + element.isField()) {
|
| DartType elementType = element.computeType(compiler);
|
| - DartType constantType = value.computeType(compiler);
|
| - if (!constantSystem.isSubtype(compiler, constantType, elementType)) {
|
| + if (elementType.kind == TypeKind.MALFORMED_TYPE && !value.isNull()) {
|
| if (isConst) {
|
| + ErroneousElement element = elementType.element;
|
| compiler.reportFatalError(
|
| - node, MessageKind.NOT_ASSIGNABLE.error,
|
| - {'fromType': constantType, 'toType': elementType});
|
| + node, element.messageKind, element.messageArguments);
|
| } else {
|
| - // If the field cannot be lazily initialized, we will throw
|
| - // the exception at runtime.
|
| + // We need to throw an exception at runtime.
|
| value = null;
|
| }
|
| + } else {
|
| + DartType constantType = value.computeType(compiler);
|
| + if (!constantSystem.isSubtype(compiler,
|
| + constantType, elementType)) {
|
| + if (isConst) {
|
| + compiler.reportFatalError(
|
| + node, MessageKind.NOT_ASSIGNABLE.error,
|
| + {'fromType': constantType, 'toType': elementType});
|
| + } else {
|
| + // If the field cannot be lazily initialized, we will throw
|
| + // the exception at runtime.
|
| + value = null;
|
| + }
|
| + }
|
| }
|
| }
|
| }
|
|
|