@@ -2909,39 +2909,27 @@ let MakeApplicableExprNoFlex cenv expr =
29092909/// This "special" node is immediately eliminated by the use of IteratedFlexibleAdjustArityOfLambdaBody as soon as we
29102910/// first transform the tree (currently in optimization)
29112911
2912- let MakeApplicableExprWithFlex cenv (env: TcEnv)compat expr =
2912+ let MakeApplicableExprWithFlex cenv (env: TcEnv) expr =
29132913 let exprTy = tyOfExpr cenv.g expr
29142914 let m = expr.Range
29152915
29162916 let isNonFlexibleType ty = isSealedTy cenv.g ty
29172917
29182918 let argTys, retTy = stripFunTy cenv.g exprTy
29192919 let curriedActualTypes = argTys |> List.map (tryDestRefTupleTy cenv.g)
2920- let noFlexInserted =
2921- (curriedActualTypes.IsEmpty ||
2922- curriedActualTypes |> List.exists (List.exists (isByrefTy cenv.g)) ||
2923- curriedActualTypes |> List.forall (List.forall isNonFlexibleType))
2924-
2925- if noFlexInserted then
2920+ if (curriedActualTypes.IsEmpty ||
2921+ curriedActualTypes |> List.exists (List.exists (isByrefTy cenv.g)) ||
2922+ curriedActualTypes |> List.forall (List.forall isNonFlexibleType)) then
2923+
29262924 ApplicableExpr (cenv, expr, true)
29272925 else
29282926 let curriedFlexibleTypes =
29292927 curriedActualTypes |> List.mapSquared (fun actualType ->
2930-
2931- if isNonFlexibleType actualType then
2932- actualType
2928+ if isNonFlexibleType actualType
2929+ then actualType
29332930 else
2934-
29352931 let flexibleType = NewInferenceType ()
2936-
2937- // For backwards compatibility mark some extra flexibility points as IsCompatFlex, meaning that the
2938- // type variable will not be generalized
2939- if compat then
2940- let tp = destTyparTy cenv.g flexibleType
2941- tp.SetIsCompatFlex(true)
2942-
2943- AddCxTypeMustSubsumeType ContextInfo.NoContext env.DisplayEnv cenv.css m NoTrace actualType flexibleType
2944-
2932+ AddCxTypeMustSubsumeType ContextInfo.NoContext env.DisplayEnv cenv.css m NoTrace actualType flexibleType;
29452933 flexibleType)
29462934
29472935 // Create a coercion to represent the expansion of the application
@@ -5255,7 +5243,7 @@ and TcPat warnOnUpper cenv env topValInfo vFlags (tpenv, names, takenNames) ty p
52555243 let args = match args with SynConstructorArgs.Pats args -> args | _ -> error(Error(FSComp.SR.tcNamedActivePattern(apinfo.ActiveTags.[idx]), m))
52565244 // TOTAL/PARTIAL ACTIVE PATTERNS
52575245 let _, vexp, _, _, tinst, _ = TcVal true cenv env tpenv vref None None m
5258- let vexp = MakeApplicableExprWithFlex cenv envfalse vexp
5246+ let vexp = MakeApplicableExprWithFlex cenv env vexp
52595247 let vexpty = vexp.Type
52605248
52615249 let activePatArgsAsSynPats, patarg =
@@ -5541,13 +5529,8 @@ and TcExprOfUnknownType cenv env tpenv expr =
55415529and TcExprFlex cenv flex compat ty (env: TcEnv) tpenv (e: SynExpr) =
55425530 if flex then
55435531 let argty = NewInferenceType ()
5544-
5545- // For backwards compatibility mark some extra flexibility points as IsCompatFlex, meaning that the
5546- // type variable will not be generalized
55475532 if compat then
5548- let tp = destTyparTy cenv.g argty
5549- tp.SetIsCompatFlex(true)
5550-
5533+ (destTyparTy cenv.g argty).SetIsCompatFlex(true)
55515534 AddCxTypeMustSubsumeType ContextInfo.NoContext env.DisplayEnv cenv.css e.Range NoTrace ty argty
55525535 let e', tpenv = TcExpr cenv argty env tpenv e
55535536 let e' = mkCoerceIfNeeded cenv.g ty argty e'
@@ -8702,9 +8685,9 @@ and TcItemThen cenv overallTy env tpenv (item, mItem, rest, afterResolution) del
87028685 let lam = mkMultiLambda mItem vs (constrApp, tyOfExpr cenv.g constrApp)
87038686 lam)
87048687 UnionCaseOrExnCheck env nargtys nargs mItem
8705- let expr =MakeApplicableExprWithFlex cenv env true ( mkExpr() )
8706- let exprTy =expr.Type
8707- PropagateThenTcDelayed cenv overallTy env tpenv mItem expr exprTy ExprAtomicFlag.Atomic delayed
8688+ let expr = mkExpr()
8689+ let exprTy =tyOfExpr cenv.g expr
8690+ PropagateThenTcDelayed cenv overallTy env tpenv mItem(MakeApplicableExprNoFlex cenv expr) exprTy ExprAtomicFlag.Atomic delayed
87088691
87098692 | Item.Types(nm, (ty::_)) ->
87108693
@@ -9001,15 +8984,15 @@ and TcItemThen cenv overallTy env tpenv (item, mItem, rest, afterResolution) del
90018984 // - it isn't a VSlotDirectCall (uses of base values do not take type arguments
90028985 let checkTys tpenv kinds = TcTypesOrMeasures (Some kinds) cenv NewTyparsOK CheckCxs ItemOccurence.UseInType env tpenv tys mItem
90038986 let _, vexp, isSpecial, _, _, tpenv = TcVal true cenv env tpenv vref (Some (NormalValUse, checkTys)) (Some afterResolution) mItem
9004- let vexpFlex = (if isSpecial then MakeApplicableExprNoFlex cenv vexp else MakeApplicableExprWithFlex cenv envfalse vexp)
8987+ let vexpFlex = (if isSpecial then MakeApplicableExprNoFlex cenv vexp else MakeApplicableExprWithFlex cenv env vexp)
90058988 // We need to eventually record the type resolution for an expression, but this is done
90068989 // inside PropagateThenTcDelayed, so we don't have to explicitly call 'CallExprHasTypeSink' here
90078990 PropagateThenTcDelayed cenv overallTy env tpenv mExprAndTypeArgs vexpFlex vexpFlex.Type ExprAtomicFlag.Atomic otherDelayed
90088991
90098992 // Value get
90108993 | _ ->
90118994 let _, vexp, isSpecial, _, _, tpenv = TcVal true cenv env tpenv vref None (Some afterResolution) mItem
9012- let vexpFlex = (if isSpecial then MakeApplicableExprNoFlex cenv vexp else MakeApplicableExprWithFlex cenv envfalse vexp)
8995+ let vexpFlex = (if isSpecial then MakeApplicableExprNoFlex cenv vexp else MakeApplicableExprWithFlex cenv env vexp)
90138996 PropagateThenTcDelayed cenv overallTy env tpenv mItem vexpFlex vexpFlex.Type ExprAtomicFlag.Atomic delayed
90148997
90158998 | Item.Property (nm, pinfos) ->
@@ -9080,7 +9063,7 @@ and TcItemThen cenv overallTy env tpenv (item, mItem, rest, afterResolution) del
90809063
90819064 // Add an I_nop if this is an initonly field to make sure we never recognize it as an lvalue. See mkExprAddrOfExpr.
90829065 mkAsmExpr ([ mkNormalLdsfld fspec ] @ (if finfo.IsInitOnly then [ AI_nop ] else []), finfo.TypeInst, [], [exprty], mItem)
9083- PropagateThenTcDelayed cenv overallTy env tpenv mItem (MakeApplicableExprWithFlex cenv envfalse expr) exprty ExprAtomicFlag.Atomic delayed
9066+ PropagateThenTcDelayed cenv overallTy env tpenv mItem (MakeApplicableExprWithFlex cenv env expr) exprty ExprAtomicFlag.Atomic delayed
90849067
90859068 | Item.RecdField rfinfo ->
90869069 // Get static F# field or literal
@@ -9109,7 +9092,7 @@ and TcItemThen cenv overallTy env tpenv (item, mItem, rest, afterResolution) del
91099092 | Some lit -> Expr.Const(lit, mItem, exprty)
91109093 // Get static F# field
91119094 | None -> mkStaticRecdFieldGet (fref, rfinfo.TypeInst, mItem)
9112- PropagateThenTcDelayed cenv overallTy env tpenv mItem (MakeApplicableExprWithFlex cenv envfalse expr) exprty ExprAtomicFlag.Atomic delayed
9095+ PropagateThenTcDelayed cenv overallTy env tpenv mItem (MakeApplicableExprWithFlex cenv env expr) exprty ExprAtomicFlag.Atomic delayed
91139096
91149097 | Item.Event einfo ->
91159098 // Instance IL event (fake up event-as-value)
@@ -9254,7 +9237,7 @@ and TcLookupThen cenv overallTy env tpenv mObjExpr objExpr objExprTy longId dela
92549237
92559238 // Instance F# Record or Class field
92569239 let objExpr' = mkRecdFieldGet cenv.g (objExpr, rfinfo.RecdFieldRef, rfinfo.TypeInst, mExprAndItem)
9257- PropagateThenTcDelayed cenv overallTy env tpenv mExprAndItem (MakeApplicableExprWithFlex cenv envfalse objExpr') fieldTy ExprAtomicFlag.Atomic delayed
9240+ PropagateThenTcDelayed cenv overallTy env tpenv mExprAndItem (MakeApplicableExprWithFlex cenv env objExpr') fieldTy ExprAtomicFlag.Atomic delayed
92589241
92599242 | Item.ILField finfo ->
92609243 // Get or set instance IL field
@@ -9271,7 +9254,7 @@ and TcLookupThen cenv overallTy env tpenv mObjExpr objExpr objExprTy longId dela
92719254 expr, tpenv
92729255 | _ ->
92739256 let expr = BuildILFieldGet cenv.g cenv.amap mExprAndItem objExpr finfo
9274- PropagateThenTcDelayed cenv overallTy env tpenv mExprAndItem (MakeApplicableExprWithFlex cenv envfalse expr) exprty ExprAtomicFlag.Atomic delayed
9257+ PropagateThenTcDelayed cenv overallTy env tpenv mExprAndItem (MakeApplicableExprWithFlex cenv env expr) exprty ExprAtomicFlag.Atomic delayed
92759258
92769259 | Item.Event einfo ->
92779260 // Instance IL event (fake up event-as-value)