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

Commitc70d57d

Browse files
committed
fix fordotnet#7: NullRef in list comprehension, when for loop works
1 parentf95ab9b commitc70d57d

File tree

3 files changed

+37
-7
lines changed

3 files changed

+37
-7
lines changed

‎src/fsharp/tc.fs‎

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3123,18 +3123,30 @@ let AnalyzeArbitraryExprAsEnumerable cenv (env: TcEnv) localAlloc m exprty expr
31233123
else
31243124
enumElemTy
31253125

3126-
let enumeratorVar,enumeratorExpr =
3127-
if isStructTy cenv.g retTypeOfGetEnumerator then
3126+
let isEnumeratorTypeStruct = isStructTy cenv.g retTypeOfGetEnumerator
3127+
let originalRetTypeOfGetEnumerator = retTypeOfGetEnumerator
3128+
3129+
let (enumeratorVar,enumeratorExpr), retTypeOfGetEnumerator =
3130+
if isEnumeratorTypeStruct then
31283131
if localAlloc then
3129-
Tastops.mkMutableCompGenLocal m "enumerator" retTypeOfGetEnumerator
3132+
Tastops.mkMutableCompGenLocal m "enumerator" retTypeOfGetEnumerator, retTypeOfGetEnumerator
31303133
else
3131-
let v,e = Tastops.mkMutableCompGenLocal m "enumerator" (mkRefCellTy cenv.g retTypeOfGetEnumerator)
3132-
v,mkRefCellGet cenv.g m retTypeOfGetEnumerator e
3134+
let refCellTyForRetTypeOfGetEnumerator = mkRefCellTy cenv.g retTypeOfGetEnumerator
3135+
let v,e = Tastops.mkMutableCompGenLocal m "enumerator" refCellTyForRetTypeOfGetEnumerator
3136+
(v, mkRefCellGet cenv.g m retTypeOfGetEnumerator e), refCellTyForRetTypeOfGetEnumerator
31333137

31343138
else
3135-
Tastops.mkCompGenLocal m "enumerator" retTypeOfGetEnumerator
3139+
Tastops.mkCompGenLocal m "enumerator" retTypeOfGetEnumerator, retTypeOfGetEnumerator
31363140

3137-
let getEnumExpr ,getEnumTy = BuildPossiblyConditionalMethodCall cenv env PossiblyMutates m false getEnumerator_minfo NormalValUse getEnumerator_minst [exprToSearchForGetEnumeratorAndItem] []
3141+
let getEnumExpr, getEnumTy =
3142+
let (getEnumExpr, getEnumTy) as res = BuildPossiblyConditionalMethodCall cenv env PossiblyMutates m false getEnumerator_minfo NormalValUse getEnumerator_minst [exprToSearchForGetEnumeratorAndItem] []
3143+
if not isEnumeratorTypeStruct || localAlloc then res
3144+
else
3145+
// wrap enumerators that are represented as mutable structs into ref cells
3146+
let getEnumExpr = mkRefCell cenv.g m originalRetTypeOfGetEnumerator getEnumExpr
3147+
let getEnumTy = mkRefCellTy cenv.g getEnumTy
3148+
getEnumExpr, getEnumTy
3149+
31383150
let guardExpr ,guardTy = BuildPossiblyConditionalMethodCall cenv env DefinitelyMutates m false moveNext_minfo NormalValUse moveNext_minst [enumeratorExpr] []
31393151
let currentExpr,currentTy = BuildPossiblyConditionalMethodCall cenv env DefinitelyMutates m true get_Current_minfo NormalValUse get_Current_minst [enumeratorExpr] []
31403152
let betterCurrentExpr = mkCoerceExpr(currentExpr,enumElemTy,currentExpr.Range,currentTy)

‎tests/fsharp/typecheck/sigs/build.bat‎

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,15 @@ call %~d0%~p0..\..\..\config.bat
88
call ..\..\single-neg-test.bat neg91
99
@if ERRORLEVEL1goto Error
1010

11+
"%FSC%"%fsc_flags% --target:exe -o:pos15.exe pos15.fs
12+
@if ERRORLEVEL1goto Error
13+
14+
"%PEVERIFY%" pos15.exe
15+
@if ERRORLEVEL1goto Error
16+
17+
pos15.exe
18+
@if ERRORLEVEL1goto Error
19+
1120
"%FSC%"%fsc_flags% --target:exe -o:pos13.exe pos13.fs
1221
@if ERRORLEVEL1goto Error
1322

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
[<Struct>]
2+
typeEnumerator=
3+
memberthis.MoveNext()=false
4+
memberthis.Current=1
5+
6+
typeCollection()=
7+
memberthis.GetEnumerator()= Enumerator()
8+
9+
[for cin Collection()doyield c]

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp