Chromium Code Reviews| Index: sdk/lib/_internal/compiler/implementation/compile_time_constants.dart |
| diff --git a/sdk/lib/_internal/compiler/implementation/compile_time_constants.dart b/sdk/lib/_internal/compiler/implementation/compile_time_constants.dart |
| index e7d3b7918f52c9bdb84e4aa8be8883f58f3cd861..fef91f69e9b433aaaab100fecea94ab88de0f21f 100644 |
| --- a/sdk/lib/_internal/compiler/implementation/compile_time_constants.dart |
| +++ b/sdk/lib/_internal/compiler/implementation/compile_time_constants.dart |
| @@ -114,20 +114,26 @@ class ConstantHandler extends CompilerTask { |
| 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 (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; |
| + if (elementType.kind == TypeKind.MALFORMED_TYPE && !value.isNull()) { |
| + // We need to throw an exception at runtime. |
| + value = null; |
|
karlklose
2013/11/05 09:48:14
make sure there is a test for this.
Johnni Winther
2013/11/05 10:58:41
Done.
|
| + } 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; |
| + } |
| } |
| } |
| } |