| Index: sdk/lib/_internal/compiler/implementation/types/simple_types_inferrer.dart | 
| =================================================================== | 
| --- sdk/lib/_internal/compiler/implementation/types/simple_types_inferrer.dart	(revision 22848) | 
| +++ sdk/lib/_internal/compiler/implementation/types/simple_types_inferrer.dart	(working copy) | 
| @@ -113,12 +113,12 @@ | 
| throw 'Unsupported operation'; | 
| } | 
|  | 
| -  bool get isNullable => true; | 
| - | 
| TypeMask intersection(TypeMask other, Compiler compiler) { | 
| return other; | 
| } | 
|  | 
| +  bool get isNullable => true; | 
| + | 
| String toString() => '$name sentinel type mask'; | 
| } | 
|  | 
| @@ -653,6 +653,18 @@ | 
| bool internalRecordType(Element analyzedElement, | 
| TypeMask newType, | 
| Map<Element, TypeMask> types) { | 
| +    if (compiler.trustTypeAnnotations | 
| +        // Parameters are being checked by the method, and we can | 
| +        // therefore only trust their type after the checks. | 
| +        || (compiler.enableTypeAssertions && !analyzedElement.isParameter())) { | 
| +      var annotation = analyzedElement.computeType(compiler); | 
| +      if (types == returnTypeOf) { | 
| +        assert(annotation is FunctionType); | 
| +        annotation = annotation.returnType; | 
| +      } | 
| +      newType = narrowType(newType, annotation); | 
| +    } | 
| + | 
| // Fields and native methods of native classes are handled | 
| // specially when querying for their type or return type. | 
| if (isNativeElement(analyzedElement)) return false; | 
| @@ -688,7 +700,15 @@ | 
| } | 
| TypeMask returnType = returnTypeOf[element]; | 
| if (returnType == null) { | 
| -      return dynamicType; | 
| +      if ((compiler.trustTypeAnnotations || compiler.enableTypeAssertions) | 
| +          && (element.isFunction() | 
| +              || element.isGetter() | 
| +              || element.isFactoryConstructor())) { | 
| +        returnType = narrowType( | 
| +            dynamicType, element.computeType(compiler).returnType); | 
| +      } else { | 
| +        returnType = dynamicType; | 
| +      } | 
| } | 
| assert(returnType != null); | 
| return returnType; | 
| @@ -753,7 +773,18 @@ | 
| } | 
| TypeMask type = typeOf[element]; | 
| if (type == null) { | 
| -      return dynamicType; | 
| +      if ((compiler.trustTypeAnnotations | 
| +           && (element.isField() | 
| +               || element.isParameter() | 
| +               || element.isVariable())) | 
| +          // Parameters are being checked by the method, and we can | 
| +          // therefore only trust their type after the checks. | 
| +          || (compiler.enableTypeAssertions | 
| +              && (element.isField() || element.isVariable()))) { | 
| +        type = narrowType(dynamicType, element.computeType(compiler)); | 
| +      } else { | 
| +        type = dynamicType; | 
| +      } | 
| } | 
| assert(type != null); | 
| return type; | 
| @@ -1254,6 +1285,7 @@ | 
| {bool isNullable: true}) { | 
| if (annotation.isDynamic) return type; | 
| if (annotation.isMalformed) return type; | 
| +    if (annotation.isVoid) return nullType; | 
| if (annotation.element == compiler.objectClass) return type; | 
| TypeMask otherType; | 
| if (annotation.kind == TypeKind.TYPEDEF | 
| @@ -1338,6 +1370,10 @@ | 
|  | 
| void update(Element local, TypeMask type) { | 
| assert(type != null); | 
| +    if (inferrer.compiler.trustTypeAnnotations | 
| +        || inferrer.compiler.enableTypeAssertions) { | 
| +      type = inferrer.narrowType(type, local.computeType(inferrer.compiler)); | 
| +    } | 
| if (capturedAndBoxed.contains(local) || inTryBlock) { | 
| // If a local is captured and boxed, or is set in a try block, | 
| // we compute the LUB of its assignments. | 
|  |