提交 d90e7280 编写于 作者: S Steffen Forkmann 提交者: Kevin Ransom (msft)

Fixes #3170 (#3173)

* cleanup

* Fixes #3170

* Adding a test
上级 b138f65a
......@@ -9931,7 +9931,7 @@ and TcMethodApplication
and TcUnnamedMethodArgs cenv env lambdaPropagationInfo tpenv args =
List.mapiFoldSquared (TcUnnamedMethodArg cenv env) (lambdaPropagationInfo,tpenv) args
and TcUnnamedMethodArg cenv env (lambdaPropagationInfo,tpenv) (i,j,CallerArg(argTy,mArg,isOpt,argExpr)) =
and TcUnnamedMethodArg cenv env (lambdaPropagationInfo,tpenv) (i,j,CallerArg(argTy,mArg,isOpt,argExpr)) =
// Try to find the lambda propagation info for the corresponding unnamed argument at this position
let lambdaPropagationInfoForArg =
[| for (unnamedInfo,_) in lambdaPropagationInfo ->
......@@ -9958,14 +9958,14 @@ and TcMethodArg cenv env (lambdaPropagationInfo,tpenv) (lambdaPropagationInfoF
// Apply the F# 3.1 rule for extracting information for lambdas
//
// Before we check the argument, check to see if we can propagate info from a called lambda expression into the arguments of a received lambda
begin
if lambdaPropagationInfoForArg.Length > 0 then
let allOverloadsAreFuncOrMismatchForThisArg =
lambdaPropagationInfoForArg |> Array.forall (function ArgDoesNotMatch | CallerLambdaHasArgTypes _ -> true | NoInfo | CalledArgMatchesType _ -> false)
if allOverloadsAreFuncOrMismatchForThisArg then
let overloadsWhichAreFuncAtThisPosition = lambdaPropagationInfoForArg |> Array.choose (function CallerLambdaHasArgTypes r -> Some (List.toArray r) | _ -> None)
if overloadsWhichAreFuncAtThisPosition.Length > 0 then
if lambdaPropagationInfoForArg.Length > 0 then
let allOverloadsAreNotCalledArgMatchesForThisArg =
lambdaPropagationInfoForArg
|> Array.forall (function ArgDoesNotMatch | CallerLambdaHasArgTypes _ | NoInfo -> true | CalledArgMatchesType _ -> false)
if allOverloadsAreNotCalledArgMatchesForThisArg then
let overloadsWhichAreFuncAtThisPosition = lambdaPropagationInfoForArg |> Array.choose (function CallerLambdaHasArgTypes r -> Some (List.toArray r) | _ -> None)
if overloadsWhichAreFuncAtThisPosition.Length > 0 then
let minFuncArity = overloadsWhichAreFuncAtThisPosition |> Array.minBy Array.length |> Array.length
let prefixOfLambdaArgsForEachOverload = overloadsWhichAreFuncAtThisPosition |> Array.map (Array.take minFuncArity)
......@@ -9987,7 +9987,6 @@ and TcMethodArg cenv env (lambdaPropagationInfo,tpenv) (lambdaPropagationInfoF
loop callerLambdaRangeTy (lambdaVarNum + 1)
| None -> ()
loop argTy 0
end
let e',tpenv = TcExpr cenv argTy env tpenv argExpr
......
// #Conformance #DeclarationElements #MemberDefinitions #Overloading
// inference failed for Linq .ToDictionary(fun,fun) - #3170
open System
open System.Linq
type GuidWrapper = GuidWrapper of Guid
with member x.Id =
let (GuidWrapper id) = x
x
let id = Guid.NewGuid()
let map = [GuidWrapper id, GuidWrapper id] |> Map
let y = map.ToDictionary((fun m -> m.Key.Id), (fun m -> m.Value.Id))
printfn "%A" y
exit 0
......@@ -24,6 +24,8 @@ NOMONO,NoMT SOURCE=ConsumeOverloadGenericMethods.fs SCFLAGS="-r:lib.dll" PRECMD=
SOURCE=OperatorOverloading04.fs # OperatorOverloading04.fs
SOURCE=E_OperatorOverloading01.fs SCFLAGS="--test:ErrorRanges" # E_OperatorOverloading01.fs
SOURCE=InferenceForLambdaArgs.fs # InferenceForLambdaArgs.fs
SOURCE=SlowOverloadResolution.fs # SlowOverloadResolution.fs
SOURCE=E_OverloadCurriedFunc.fs # E_OverloadCurriedFunc.fs
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册