| Index: pkg/kernel/lib/analyzer/ast_from_analyzer.dart | 
| diff --git a/pkg/kernel/lib/analyzer/ast_from_analyzer.dart b/pkg/kernel/lib/analyzer/ast_from_analyzer.dart | 
| index 25add69328fc71ba8c719477e8919ce22c694f2e..e232b29d007029f50c85d0d5dadb8ae4d3b234d7 100644 | 
| --- a/pkg/kernel/lib/analyzer/ast_from_analyzer.dart | 
| +++ b/pkg/kernel/lib/analyzer/ast_from_analyzer.dart | 
| @@ -400,9 +400,10 @@ class TypeScope extends ReferenceScope { | 
| return _typeBuilder.buildList(node.arguments); | 
| } | 
|  | 
| -  List<ast.TypeParameter> buildOptionalTypeParameterList( | 
| -      TypeParameterList node) { | 
| +  List<ast.TypeParameter> buildOptionalTypeParameterList(TypeParameterList node, | 
| +      {bool strongModeOnly: false}) { | 
| if (node == null) return <ast.TypeParameter>[]; | 
| +    if (strongModeOnly && !strongMode) return <ast.TypeParameter>[]; | 
| return node.typeParameters.map(buildTypeParameter).toList(); | 
| } | 
|  | 
| @@ -431,10 +432,12 @@ class TypeScope extends ReferenceScope { | 
| // Initialize type parameters in two passes: put them into scope, | 
| // and compute the bounds afterwards while they are all in scope. | 
| var typeParameters = <ast.TypeParameter>[]; | 
| -    for (var parameter in element.typeParameters) { | 
| -      var parameterNode = new ast.TypeParameter(parameter.name); | 
| -      typeParameters.add(parameterNode); | 
| -      localTypeParameters[parameter] = parameterNode; | 
| +    if (strongMode || element is ConstructorElement) { | 
| +      for (var parameter in element.typeParameters) { | 
| +        var parameterNode = new ast.TypeParameter(parameter.name); | 
| +        typeParameters.add(parameterNode); | 
| +        localTypeParameters[parameter] = parameterNode; | 
| +      } | 
| } | 
| for (int i = 0; i < typeParameters.length; ++i) { | 
| var parameter = element.typeParameters[i]; | 
| @@ -1280,8 +1283,9 @@ class StatementBuilder extends GeneralizingAstVisitor<ast.Statement> { | 
| return new ast.FunctionDeclaration( | 
| scope.makeVariableDeclaration(element), | 
| scope.buildFunctionNode(expression.parameters, expression.body, | 
| -            typeParameters: | 
| -                scope.buildOptionalTypeParameterList(expression.typeParameters), | 
| +            typeParameters: scope.buildOptionalTypeParameterList( | 
| +                expression.typeParameters, | 
| +                strongModeOnly: true), | 
| returnType: declaration.returnType)); | 
| } | 
|  | 
| @@ -1475,8 +1479,9 @@ class ExpressionBuilder | 
| ast.Expression visitFunctionExpression(FunctionExpression node) { | 
| return new ast.FunctionExpression(scope.buildFunctionNode( | 
| node.parameters, node.body, | 
| -        typeParameters: | 
| -            scope.buildOptionalTypeParameterList(node.typeParameters), | 
| +        typeParameters: scope.buildOptionalTypeParameterList( | 
| +            node.typeParameters, | 
| +            strongModeOnly: true), | 
| inferredReturnType: scope.getInferredReturnType(node))); | 
| } | 
|  | 
| @@ -1506,10 +1511,14 @@ class ExpressionBuilder | 
| } | 
|  | 
| ast.Arguments buildArgumentsForInvocation(InvocationExpression node) { | 
| -    return buildArguments(node.argumentList, | 
| -        explicitTypeArguments: node.typeArguments, | 
| -        inferTypeArguments: () => | 
| -            scope.getInferredInvocationTypeArguments(node)); | 
| +    if (scope.strongMode) { | 
| +      return buildArguments(node.argumentList, | 
| +          explicitTypeArguments: node.typeArguments, | 
| +          inferTypeArguments: () => | 
| +              scope.getInferredInvocationTypeArguments(node)); | 
| +    } else { | 
| +      return buildArguments(node.argumentList); | 
| +    } | 
| } | 
|  | 
| static final ast.Name callName = new ast.Name('call'); | 
| @@ -2097,6 +2106,12 @@ class TypeAnnotationBuilder extends GeneralizingAstVisitor<ast.DartType> { | 
| return convertType(type, null); | 
| } | 
|  | 
| +  /// True if [parameter] should not be reified, because spec mode does not | 
| +  /// currently reify generic method type parameters. | 
| +  bool isUnreifiedTypeParameter(TypeParameterElement parameter) { | 
| +    return !scope.strongMode && parameter.enclosingElement is! ClassElement; | 
| +  } | 
| + | 
| /// Converts [type] to an [ast.DartType], while replacing unbound type | 
| /// variables with 'dynamic'. | 
| /// | 
| @@ -2106,6 +2121,9 @@ class TypeAnnotationBuilder extends GeneralizingAstVisitor<ast.DartType> { | 
| ast.DartType convertType( | 
| DartType type, List<TypeParameterElement> boundVariables) { | 
| if (type is TypeParameterType) { | 
| +      if (isUnreifiedTypeParameter(type.element)) { | 
| +        return const ast.DynamicType(); | 
| +      } | 
| if (boundVariables == null || boundVariables.contains(type)) { | 
| var typeParameter = scope.getTypeParameterReference(type.element); | 
| if (!scope.allowClassTypeParameters && | 
| @@ -2214,6 +2232,9 @@ class TypeAnnotationBuilder extends GeneralizingAstVisitor<ast.DartType> { | 
| typeParameter.parent is ast.Class) { | 
| return const ast.InvalidType(); | 
| } | 
| +        if (isUnreifiedTypeParameter(element)) { | 
| +          return const ast.DynamicType(); | 
| +        } | 
| return new ast.TypeParameterType(typeParameter); | 
|  | 
| case ElementKind.COMPILATION_UNIT: | 
| @@ -2698,9 +2719,9 @@ class MemberBodyBuilder extends GeneralizingAstVisitor<Null> { | 
| returnType: node.returnType, | 
| inferredReturnType: scope.buildType( | 
| resolutionMap.elementDeclaredByMethodDeclaration(node).returnType), | 
| -        typeParameters: | 
| -            scope.buildOptionalTypeParameterList(node.typeParameters)) | 
| -      ..parent = procedure; | 
| +        typeParameters: scope.buildOptionalTypeParameterList( | 
| +            node.typeParameters, | 
| +            strongModeOnly: true))..parent = procedure; | 
| handleNativeBody(node.body); | 
| } | 
|  | 
| @@ -2725,9 +2746,9 @@ class MemberBodyBuilder extends GeneralizingAstVisitor<Null> { | 
| procedure.function = scope.buildFunctionNode( | 
| function.parameters, function.body, | 
| returnType: node.returnType, | 
| -        typeParameters: | 
| -            scope.buildOptionalTypeParameterList(function.typeParameters)) | 
| -      ..parent = procedure; | 
| +        typeParameters: scope.buildOptionalTypeParameterList( | 
| +            function.typeParameters, | 
| +            strongModeOnly: true))..parent = procedure; | 
| handleNativeBody(function.body); | 
| } | 
|  | 
|  |