@@ -1900,81 +1900,85 @@ and CanMemberSigsMatchUpToCheck
19001900( subsumeArg : CalledArg -> CallerArg < _ > -> OperationResult < unit >) // used to compare the arguments for compatibility
19011901reqdRetTyOpt
19021902( calledMeth : CalledMeth < _ >): ImperativeOperationResult =
1903-
1904- let g = csenv.g
1905- let amap = csenv.amap
1906- let m = csenv.m
1903+ trackErrors {
1904+ let g = csenv.g
1905+ let amap = csenv.amap
1906+ let m = csenv.m
19071907
1908- let minfo = calledMeth.Method
1909- let minst = calledMeth.CalledTyArgs
1910- let uminst = calledMeth.CallerTyArgs
1911- let callerObjArgTys = calledMeth.CallerObjArgTys
1912- let assignedItemSetters = calledMeth.AssignedItemSetters
1913- let unnamedCalledOptArgs = calledMeth.UnnamedCalledOptArgs
1914- let unnamedCalledOutArgs = calledMeth.UnnamedCalledOutArgs
1915-
1916- // First equate the method instantiation (if any) with the method type parameters
1917- if minst.Length<> uminst.Lengththen ErrorD ( Error ( FSComp.SR.csTypeInstantiationLengthMismatch (), m )) else
1918-
1919- Iterate2D unifyTypes minst uminst ++ ( fun () ->
1920-
1921- if not ( permitOptArgs|| isNil unnamedCalledOptArgs) then ErrorD ( Error ( FSComp.SR.csOptionalArgumentNotPermittedHere (), m )) else
1922-
1923-
1924- let calledObjArgTys = calledMeth.CalledObjArgTys( m)
1908+ let minfo = calledMeth.Method
1909+ let minst = calledMeth.CalledTyArgs
1910+ let uminst = calledMeth.CallerTyArgs
1911+ let callerObjArgTys = calledMeth.CallerObjArgTys
1912+ let assignedItemSetters = calledMeth.AssignedItemSetters
1913+ let unnamedCalledOptArgs = calledMeth.UnnamedCalledOptArgs
1914+ let unnamedCalledOutArgs = calledMeth.UnnamedCalledOutArgs
1915+
1916+ // First equate the method instantiation (if any) with the method type parameters
1917+ if minst.Length<> uminst.Lengththen
1918+ return ! ErrorD ( Error ( FSComp.SR.csTypeInstantiationLengthMismatch (), m ))
1919+ else
1920+ do ! Iterate2D unifyTypes minst uminst
1921+ if not ( permitOptArgs|| isNil unnamedCalledOptArgs) then
1922+ return ! ErrorD ( Error ( FSComp.SR.csOptionalArgumentNotPermittedHere (), m ))
1923+ else
1924+ let calledObjArgTys = calledMeth.CalledObjArgTys( m)
19251925
1926- // Check all the argument types.
1926+ // Check all the argument types.
19271927
1928- if calledObjArgTys.Length<> callerObjArgTys.Lengththen
1929- if ( calledObjArgTys.Length<> 0 ) then
1930- ErrorD( Error( FSComp.SR.csMemberIsNotStatic( minfo.LogicalName), m))
1931- else
1932- ErrorD( Error( FSComp.SR.csMemberIsNotInstance( minfo.LogicalName), m))
1933- else
1934- Iterate2D subsumeTypes calledObjArgTys callerObjArgTys++ ( fun () ->
1935- ( calledMeth.ArgSets|> IterateD( fun argSet ->
1936- if argSet.UnnamedCalledArgs.Length<> argSet.UnnamedCallerArgs.Lengththen ErrorD( Error( FSComp.SR.csArgumentLengthMismatch(), m)) else
1937- Iterate2D subsumeArg argSet.UnnamedCalledArgs argSet.UnnamedCallerArgs)) ++ ( fun () ->
1938- ( calledMeth.ParamArrayCalledArgOpt|> OptionD( fun calledArg ->
1939- if isArray1DTy g calledArg.CalledArgumentTypethen
1940- let paramArrayElemTy = destArrayTy g calledArg.CalledArgumentType
1941- let reflArgInfo = calledArg.ReflArgInfo// propgate the reflected-arg info to each param array argument
1942- calledMeth.ParamArrayCallerArgs|> OptionD( IterateD( fun callerArg -> subsumeArg( CalledArg(( 0 , 0 ), false , NotOptional, NoCallerInfo, false , false , None, reflArgInfo, paramArrayElemTy)) callerArg))
1943- else
1944- CompleteD)
1945-
1946- ) ++ ( fun () ->
1947- ( calledMeth.ArgSets|> IterateD( fun argSet ->
1948- argSet.AssignedNamedArgs|> IterateD( fun arg -> subsumeArg arg.CalledArg arg.CallerArg))) ++ ( fun () ->
1949- ( assignedItemSetters|> IterateD( fun ( AssignedItemSetter ( _ , item , caller )) ->
1950- let name , calledArgTy =
1951- match itemwith
1952- | AssignedPropSetter(_, pminfo, pminst) ->
1953- let calledArgTy = List.head( List.head( pminfo.GetParamTypes( amap, m, pminst)))
1954- pminfo.LogicalName, calledArgTy
1955-
1956- | AssignedILFieldSetter( finfo) ->
1957- (* Get or set instance IL field*)
1958- let calledArgTy = finfo.FieldType( amap, m)
1959- finfo.FieldName, calledArgTy
1928+ if calledObjArgTys.Length<> callerObjArgTys.Lengththen
1929+ if ( calledObjArgTys.Length<> 0 ) then
1930+ return ! ErrorD( Error( FSComp.SR.csMemberIsNotStatic( minfo.LogicalName), m))
1931+ else
1932+ return ! ErrorD( Error( FSComp.SR.csMemberIsNotInstance( minfo.LogicalName), m))
1933+ else
1934+ do ! Iterate2D subsumeTypes calledObjArgTys callerObjArgTys
1935+ for argSetin calledMeth.ArgSetsdo
1936+ if argSet.UnnamedCalledArgs.Length<> argSet.UnnamedCallerArgs.Lengththen
1937+ return ! ErrorD( Error( FSComp.SR.csArgumentLengthMismatch(), m))
1938+ else
1939+ do ! Iterate2D subsumeArg argSet.UnnamedCalledArgs argSet.UnnamedCallerArgs
1940+ match calledMeth.ParamArrayCalledArgOptwith
1941+ | Some calledArg->
1942+ if isArray1DTy g calledArg.CalledArgumentTypethen
1943+ let paramArrayElemTy = destArrayTy g calledArg.CalledArgumentType
1944+ let reflArgInfo = calledArg.ReflArgInfo// propgate the reflected-arg info to each param array argument
1945+ match calledMeth.ParamArrayCallerArgswith
1946+ | Some args->
1947+ for callerArgin argsdo
1948+ do ! subsumeArg( CalledArg(( 0 , 0 ), false , NotOptional, NoCallerInfo, false , false , None, reflArgInfo, paramArrayElemTy)) callerArg
1949+ | _ -> ()
1950+ | _ -> ()
1951+ for argSetin calledMeth.ArgSetsdo
1952+ for argin argSet.AssignedNamedArgsdo
1953+ do ! subsumeArg arg.CalledArg arg.CallerArg
1954+ for ( AssignedItemSetter(_, item, caller)) in assignedItemSettersdo
1955+ let name , calledArgTy =
1956+ match itemwith
1957+ | AssignedPropSetter(_, pminfo, pminst) ->
1958+ let calledArgTy = List.head( List.head( pminfo.GetParamTypes( amap, m, pminst)))
1959+ pminfo.LogicalName, calledArgTy
1960+
1961+ | AssignedILFieldSetter( finfo) ->
1962+ (* Get or set instance IL field*)
1963+ let calledArgTy = finfo.FieldType( amap, m)
1964+ finfo.FieldName, calledArgTy
19601965
1961- | AssignedRecdFieldSetter( rfinfo) ->
1962- let calledArgTy = rfinfo.FieldType
1963- rfinfo.Name, calledArgTy
1966+ | AssignedRecdFieldSetter( rfinfo) ->
1967+ let calledArgTy = rfinfo.FieldType
1968+ rfinfo.Name, calledArgTy
19641969
1965- subsumeArg( CalledArg((- 1 , 0 ), false , NotOptional, NoCallerInfo, false , false , Some( mkSynId m name), ReflectedArgInfo.None, calledArgTy)) caller) )) ++ ( fun () ->
1966-
1967- // - Always take the return type into account for
1968- // -- op_Explicit, op_Implicit
1969- // -- methods using tupling of unfilled out args
1970- // - Never take into account return type information for constructors
1971- match reqdRetTyOptwith
1972- | None-> CompleteD
1973- | Some_ when minfo.IsConstructor-> CompleteD
1974- | Some_ when not alwaysCheckReturn&& isNil unnamedCalledOutArgs-> CompleteD
1975- | Some reqdRetTy->
1976- let methodRetTy = calledMeth.CalledReturnTypeAfterOutArgTupling
1977- unifyTypes reqdRetTy methodRetTy)))))
1970+ do ! subsumeArg( CalledArg((- 1 , 0 ), false , NotOptional, NoCallerInfo, false , false , Some( mkSynId m name), ReflectedArgInfo.None, calledArgTy)) caller
1971+ // - Always take the return type into account for
1972+ // -- op_Explicit, op_Implicit
1973+ // -- methods using tupling of unfilled out args
1974+ // - Never take into account return type information for constructors
1975+ match reqdRetTyOptwith
1976+ | Some_ when ( minfo.IsConstructor|| not alwaysCheckReturn&& isNil unnamedCalledOutArgs) -> ()
1977+ | Some reqdRetTy->
1978+ let methodRetTy = calledMeth.CalledReturnTypeAfterOutArgTupling
1979+ return ! unifyTypes reqdRetTy methodRetTy
1980+ | _ -> ()
1981+ }
19781982
19791983// Assert a subtype constraint, and wrap an ErrorsFromAddingSubsumptionConstraint error around any failure
19801984// to allow us to report the outer types involved in the constraint