Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit43fab18

Browse files
author
Kevin Ransom
committed
Revert "[RFCs FS-1037] allow flexible inference (subsumption) at union construction (#5030)"
This reverts commit5cac4f6.
1 parent6c801b2 commit43fab18

File tree

7 files changed

+41
-84
lines changed

7 files changed

+41
-84
lines changed

‎src/fsharp/TypeChecker.fs‎

Lines changed: 19 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -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)compatexpr =
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 envfalsevexp
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 =
55415529
and 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 cenvexpr) 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 envfalsevexp)
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 envfalsevexp)
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 envfalseexpr) 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 envfalseexpr) 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 envfalseobjExpr') 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 envfalseexpr) 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)

‎tests/fsharp/core/quotes/test.fsx‎

Lines changed: 0 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1744,30 +1744,6 @@ module QuotationStructUnionTests =
17441744
//test "check NewUnionCase" (<@ A1(1,2) @> |> (function NewUnionCase(unionCase,[ Int32 1; Int32 2 ]) -> true | _ -> false))
17451745

17461746

1747-
moduleFlexibleUnionConstructorTests=
1748-
1749-
[<Struct>]
1750-
typeT=| Aofseq<int>
1751-
1752-
typeU=| Bofseq<int>
1753-
lettestList=[1..3]
1754-
lettestFunction caseName x=
1755-
match xwith
1756-
| Call(None,_,
1757-
[PropertyGet(None,_,_);
1758-
Let(_, Lambda(_, NewUnionCase(unioncase,_)),
1759-
Lambda(_, Application(_, Coerce(_, ty))))])->
1760-
unioncase.Name= caseName&&
1761-
ty.Name="IEnumerable`1"
1762-
|_->false
1763-
1764-
test"check struct flexible union constructor"
1765-
(<@ testList|> A@>|> testFunction"A")
1766-
1767-
test"check flexible union constructor"
1768-
(<@ testList|> B@>|> testFunction"B")
1769-
1770-
17711747
moduleEqualityOnExprDoesntFail=
17721748
letq=<@1@>
17731749
check"we09ceo"(q.Equals(1))false

‎tests/fsharp/typecheck/sigs/neg20.bsl‎

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,24 @@ but here has type
131131

132132
neg20.fs(99,26,99,33): typecheck error FS0001: All elements of a list constructor expression must have the same type. This expression was expectedto have type 'B', but here has type 'A'.
133133

134+
neg20.fs(108,12,108,16): typecheck error FS0001: Type mismatch. Expecting a
135+
'B* B-> 'a'
136+
but given a
137+
'A* A-> Data'
138+
The type 'B' doesnot match the type 'A'
139+
140+
neg20.fs(109,12,109,16): typecheck error FS0001: Type mismatch. Expecting a
141+
'A* B-> 'a'
142+
but given a
143+
'A* A-> Data'
144+
The type 'B' doesnot match the type 'A'
145+
146+
neg20.fs(110,12,110,16): typecheck error FS0001: Type mismatch. Expecting a
147+
'B* A-> 'a'
148+
but given a
149+
'A* A-> Data'
150+
The type 'B' doesnot match the type 'A'
151+
134152
neg20.fs(128,19,128,22): typecheck error FS0001: This expression was expectedto have type
135153
'string'
136154
but here has type

‎tests/fsharp/typecheck/sigs/neg20.fs‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -105,9 +105,9 @@ module NoSubsumptionForLists2 =
105105
letpBB=(new B(),new B())
106106
letpAB=(new A(),new B())
107107
letpBA=(new B(),new A())
108-
pBB|> Data// permitted
109-
pAB|> Data// permitted
110-
pBA|> Data// permitted
108+
pBB|> Data//notpermitted (questionable)
109+
pAB|> Data//notpermitted (questionable)
110+
pBA|> Data//notpermitted (questionable)
111111
pBB|> data// permitted
112112
pAB|> data// permitted
113113
pBA|> data// permitted

‎tests/fsharpqa/Source/Conformance/BasicTypeAndModuleDefinitions/UnionTypes/ConstructorFlexibleWhenPiping.fsx‎

Lines changed: 0 additions & 8 deletions
This file was deleted.

‎tests/fsharpqa/Source/Conformance/BasicTypeAndModuleDefinitions/UnionTypes/StructConstructorFlexibleWhenPiping.fsx‎

Lines changed: 0 additions & 9 deletions
This file was deleted.

‎tests/fsharpqa/Source/Conformance/BasicTypeAndModuleDefinitions/UnionTypes/env.lst‎

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,4 @@ NoMTSOURCE=Overload_ToString.fs COMPILE_ONLY=1 SCFLAGS=--warnaserror+ FSIMOD
9999
SOURCE=E_UnionFieldConflictingName.fs SCFLAGS="--test:ErrorRanges"# E_UnionFieldConflictingName.fs
100100
SOURCE=E_UnionConstructorBadFieldName.fs SCFLAGS="--test:ErrorRanges"# E_UnionConstructorBadFieldName.fs
101101
SOURCE=E_FieldNameUsedMulti.fs SCFLAGS="--test:ErrorRanges"# E_FieldNameUsedMulti.fs
102-
SOURCE=E_FieldMemberClash.fs SCFLAGS="--test:ErrorRanges"# E_FieldMemberClash.fs
103-
104-
SOURCE=ConstructorFlexibleWhenPiping.fsx# ConstructorFlexibleWhenPiping.fsx
105-
SOURCE=StructConstructorFlexibleWhenPiping.fsx# StructConstructorFlexibleWhenPiping.fsx
102+
SOURCE=E_FieldMemberClash.fs SCFLAGS="--test:ErrorRanges"# E_FieldMemberClash.fs

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp