@@ -2899,27 +2899,39 @@ let MakeApplicableExprNoFlex cenv expr =
28992899/// This "special" node is immediately eliminated by the use of IteratedFlexibleAdjustArityOfLambdaBody as soon as we
29002900/// first transform the tree (currently in optimization)
29012901
2902- let MakeApplicableExprWithFlex cenv (env: TcEnv) expr =
2902+ let MakeApplicableExprWithFlex cenv (env: TcEnv)compat expr =
29032903 let exprTy = tyOfExpr cenv.g expr
29042904 let m = expr.Range
29052905
29062906 let isNonFlexibleType ty = isSealedTy cenv.g ty
29072907
29082908 let argTys, retTy = stripFunTy cenv.g exprTy
29092909 let curriedActualTypes = argTys |> List.map (tryDestRefTupleTy cenv.g)
2910- if (curriedActualTypes.IsEmpty ||
2911- curriedActualTypes |> List.exists (List.exists (isByrefTy cenv.g)) ||
2912- curriedActualTypes |> List.forall (List.forall isNonFlexibleType)) then
2913-
2910+ let noFlexInserted =
2911+ (curriedActualTypes.IsEmpty ||
2912+ curriedActualTypes |> List.exists (List.exists (isByrefTy cenv.g)) ||
2913+ curriedActualTypes |> List.forall (List.forall isNonFlexibleType))
2914+
2915+ if noFlexInserted then
29142916 ApplicableExpr (cenv, expr, true)
29152917 else
29162918 let curriedFlexibleTypes =
29172919 curriedActualTypes |> List.mapSquared (fun actualType ->
2918- if isNonFlexibleType actualType
2919- then actualType
2920+
2921+ if isNonFlexibleType actualType then
2922+ actualType
29202923 else
2924+
29212925 let flexibleType = NewInferenceType ()
2922- AddCxTypeMustSubsumeType ContextInfo.NoContext env.DisplayEnv cenv.css m NoTrace actualType flexibleType;
2926+
2927+ // For backwards compatibility mark some extra flexibility points as IsCompatFlex, meaning that the
2928+ // type variable will not be generalized
2929+ if compat then
2930+ let tp = destTyparTy cenv.g flexibleType
2931+ tp.SetIsCompatFlex(true)
2932+
2933+ AddCxTypeMustSubsumeType ContextInfo.NoContext env.DisplayEnv cenv.css m NoTrace actualType flexibleType
2934+
29232935 flexibleType)
29242936
29252937 // Create a coercion to represent the expansion of the application
@@ -5179,7 +5191,7 @@ and TcPat warnOnUpper cenv env topValInfo vFlags (tpenv, names, takenNames) ty p
51795191 let args = match args with SynConstructorArgs.Pats args -> args | _ -> error(Error(FSComp.SR.tcNamedActivePattern(apinfo.ActiveTags.[idx]), m))
51805192 // TOTAL/PARTIAL ACTIVE PATTERNS
51815193 let _, vexp, _, _, tinst, _ = TcVal true cenv env tpenv vref None None m
5182- let vexp = MakeApplicableExprWithFlex cenv env vexp
5194+ let vexp = MakeApplicableExprWithFlex cenv envfalse vexp
51835195 let vexpty = vexp.Type
51845196
51855197 let activePatArgsAsSynPats, patarg =
@@ -5465,8 +5477,13 @@ and TcExprOfUnknownType cenv env tpenv expr =
54655477and TcExprFlex cenv flex compat ty (env: TcEnv) tpenv (e: SynExpr) =
54665478 if flex then
54675479 let argty = NewInferenceType ()
5480+
5481+ // For backwards compatibility mark some extra flexibility points as IsCompatFlex, meaning that the
5482+ // type variable will not be generalized
54685483 if compat then
5469- (destTyparTy cenv.g argty).SetIsCompatFlex(true)
5484+ let tp = destTyparTy cenv.g argty
5485+ tp.SetIsCompatFlex(true)
5486+
54705487 AddCxTypeMustSubsumeType ContextInfo.NoContext env.DisplayEnv cenv.css e.Range NoTrace ty argty
54715488 let e', tpenv = TcExpr cenv argty env tpenv e
54725489 let e' = mkCoerceIfNeeded cenv.g ty argty e'
@@ -8583,9 +8600,9 @@ and TcItemThen cenv overallTy env tpenv (item, mItem, rest, afterResolution) del
85838600 let lam = mkMultiLambda mItem vs (constrApp, tyOfExpr cenv.g constrApp)
85848601 lam)
85858602 UnionCaseOrExnCheck env nargtys nargs mItem
8586- let expr = mkExpr()
8587- let exprTy =tyOfExpr cenv.g expr
8588- PropagateThenTcDelayed cenv overallTy env tpenv mItem(MakeApplicableExprNoFlex cenv expr) exprTy ExprAtomicFlag.Atomic delayed
8603+ let expr =MakeApplicableExprWithFlex cenv env true ( mkExpr() )
8604+ let exprTy = expr.Type
8605+ PropagateThenTcDelayed cenv overallTy env tpenv mItem expr exprTy ExprAtomicFlag.Atomic delayed
85898606
85908607 | Item.Types(nm, (typ::_)) ->
85918608
@@ -8878,15 +8895,15 @@ and TcItemThen cenv overallTy env tpenv (item, mItem, rest, afterResolution) del
88788895 // - it isn't a VSlotDirectCall (uses of base values do not take type arguments
88798896 let checkTys tpenv kinds = TcTypesOrMeasures (Some kinds) cenv NewTyparsOK CheckCxs ItemOccurence.UseInType env tpenv tys mItem
88808897 let _, vexp, isSpecial, _, _, tpenv = TcVal true cenv env tpenv vref (Some (NormalValUse, checkTys)) (Some afterResolution) mItem
8881- let vexpFlex = (if isSpecial then MakeApplicableExprNoFlex cenv vexp else MakeApplicableExprWithFlex cenv env vexp)
8898+ let vexpFlex = (if isSpecial then MakeApplicableExprNoFlex cenv vexp else MakeApplicableExprWithFlex cenv envfalse vexp)
88828899 // We need to eventually record the type resolution for an expression, but this is done
88838900 // inside PropagateThenTcDelayed, so we don't have to explicitly call 'CallExprHasTypeSink' here
88848901 PropagateThenTcDelayed cenv overallTy env tpenv mExprAndTypeArgs vexpFlex vexpFlex.Type ExprAtomicFlag.Atomic otherDelayed
88858902
88868903 // Value get
88878904 | _ ->
88888905 let _, vexp, isSpecial, _, _, tpenv = TcVal true cenv env tpenv vref None (Some afterResolution) mItem
8889- let vexpFlex = (if isSpecial then MakeApplicableExprNoFlex cenv vexp else MakeApplicableExprWithFlex cenv env vexp)
8906+ let vexpFlex = (if isSpecial then MakeApplicableExprNoFlex cenv vexp else MakeApplicableExprWithFlex cenv envfalse vexp)
88908907 PropagateThenTcDelayed cenv overallTy env tpenv mItem vexpFlex vexpFlex.Type ExprAtomicFlag.Atomic delayed
88918908
88928909 | Item.Property (nm, pinfos) ->
@@ -8947,7 +8964,7 @@ and TcItemThen cenv overallTy env tpenv (item, mItem, rest, afterResolution) del
89478964
89488965 // Add an I_nop if this is an initonly field to make sure we never recognize it as an lvalue. See mkExprAddrOfExpr.
89498966 mkAsmExpr ([ mkNormalLdsfld fspec ] @ (if finfo.IsInitOnly then [ AI_nop ] else []), finfo.TypeInst, [], [exprty], mItem)
8950- PropagateThenTcDelayed cenv overallTy env tpenv mItem (MakeApplicableExprWithFlex cenv env expr) exprty ExprAtomicFlag.Atomic delayed
8967+ PropagateThenTcDelayed cenv overallTy env tpenv mItem (MakeApplicableExprWithFlex cenv envfalse expr) exprty ExprAtomicFlag.Atomic delayed
89518968
89528969 | Item.RecdField rfinfo ->
89538970 // Get static F# field or literal
@@ -8976,7 +8993,7 @@ and TcItemThen cenv overallTy env tpenv (item, mItem, rest, afterResolution) del
89768993 | Some lit -> Expr.Const(lit, mItem, exprty)
89778994 // Get static F# field
89788995 | None -> mkStaticRecdFieldGet (fref, rfinfo.TypeInst, mItem)
8979- PropagateThenTcDelayed cenv overallTy env tpenv mItem (MakeApplicableExprWithFlex cenv env expr) exprty ExprAtomicFlag.Atomic delayed
8996+ PropagateThenTcDelayed cenv overallTy env tpenv mItem (MakeApplicableExprWithFlex cenv envfalse expr) exprty ExprAtomicFlag.Atomic delayed
89808997
89818998 | Item.Event einfo ->
89828999 // Instance IL event (fake up event-as-value)
@@ -9112,7 +9129,7 @@ and TcLookupThen cenv overallTy env tpenv mObjExpr objExpr objExprTy longId dela
91129129
91139130 // Instance F# Record or Class field
91149131 let objExpr' = mkRecdFieldGet cenv.g (objExpr, rfinfo.RecdFieldRef, rfinfo.TypeInst, mExprAndItem)
9115- PropagateThenTcDelayed cenv overallTy env tpenv mExprAndItem (MakeApplicableExprWithFlex cenv env objExpr') fieldTy ExprAtomicFlag.Atomic delayed
9132+ PropagateThenTcDelayed cenv overallTy env tpenv mExprAndItem (MakeApplicableExprWithFlex cenv envfalse objExpr') fieldTy ExprAtomicFlag.Atomic delayed
91169133
91179134 | Item.ILField finfo ->
91189135 // Get or set instance IL field
@@ -9129,7 +9146,7 @@ and TcLookupThen cenv overallTy env tpenv mObjExpr objExpr objExprTy longId dela
91299146 expr, tpenv
91309147 | _ ->
91319148 let expr = BuildILFieldGet cenv.g cenv.amap mExprAndItem objExpr finfo
9132- PropagateThenTcDelayed cenv overallTy env tpenv mExprAndItem (MakeApplicableExprWithFlex cenv env expr) exprty ExprAtomicFlag.Atomic delayed
9149+ PropagateThenTcDelayed cenv overallTy env tpenv mExprAndItem (MakeApplicableExprWithFlex cenv envfalse expr) exprty ExprAtomicFlag.Atomic delayed
91339150
91349151 | Item.Event einfo ->
91359152 // Instance IL event (fake up event-as-value)