Skip to content

fix 865 - Witness to trait constraint causes throw of TypeInitializationException #1323

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 6 commits into from
Jul 21, 2016
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 4 additions & 9 deletions src/fsharp/CompileOps.fs
Original file line number Diff line number Diff line change
Expand Up @@ -2176,11 +2176,7 @@ type TcConfigBuilder =
resolutionAssemblyFoldersConditions = ""
platform = None
prefer32Bit = false
#if ENABLE_MONO_SUPPORT
useSimpleResolution = runningOnMono
#else
useSimpleResolution = false
#endif
target = ConsoleExe
debuginfo = false
testFlagEmitFeeFeeAs100001 = false
Expand Down Expand Up @@ -5323,7 +5319,7 @@ let TypeCheckSingleInputAndFinishEventually(checkForErrors, tcConfig: TcConfig,
return TypeCheckMultipleInputsFinish([results],tcState)
}

let TypeCheckClosedInputSetFinish (mimpls, tcState) =
let TypeCheckClosedInputSetFinish (declaredImpls: TypedImplFile list, tcState) =
// Publish the latest contents to the CCU
tcState.tcsCcu.Deref.Contents <- tcState.tcsCcuType

Expand All @@ -5333,12 +5329,11 @@ let TypeCheckClosedInputSetFinish (mimpls, tcState) =
if not (Zset.contains qualNameOfFile rootImpls) then
errorR(Error(FSComp.SR.buildSignatureWithoutImplementation(qualNameOfFile.Text), qualNameOfFile.Range)))

let tassembly = TAssembly(mimpls)
tcState, tassembly
tcState, declaredImpls

let TypeCheckClosedInputSet (checkForErrors, tcConfig, tcImports, tcGlobals, prefixPathOpt, tcState, inputs) =
// tcEnvAtEndOfLastFile is the environment required by fsi.exe when incrementally adding definitions
let (tcEnvAtEndOfLastFile, topAttrs, mimpls),tcState = TypeCheckMultipleInputs (checkForErrors, tcConfig, tcImports, tcGlobals, prefixPathOpt, tcState, inputs)
let tcState,tassembly = TypeCheckClosedInputSetFinish (mimpls, tcState)
tcState, topAttrs, tassembly, tcEnvAtEndOfLastFile
let tcState, declaredImpls = TypeCheckClosedInputSetFinish (mimpls, tcState)
tcState, topAttrs, declaredImpls, tcEnvAtEndOfLastFile

15 changes: 6 additions & 9 deletions src/fsharp/CompileOps.fsi
Original file line number Diff line number Diff line change
Expand Up @@ -594,7 +594,7 @@ type TcImports =
member GetCcusExcludingBase : unit -> CcuThunk list
member FindDllInfo : range * string -> ImportedBinary
member TryFindDllInfo : range * string * lookupOnly: bool -> option<ImportedBinary>
member FindCcuFromAssemblyRef : range * ILAssemblyRef -> Tast.CcuResolutionResult
member FindCcuFromAssemblyRef : range * ILAssemblyRef -> CcuResolutionResult
#if EXTENSIONTYPING
member ProviderGeneratedTypeRoots : ProviderGeneratedType list
#endif
Expand Down Expand Up @@ -661,8 +661,7 @@ val ProcessMetaCommandsFromInput :
val ApplyMetaCommandsFromInputToTcConfig : TcConfig -> (Ast.ParsedInput * string) -> TcConfig

/// Process the #nowarn in an input
val ApplyNoWarnsToTcConfig : TcConfig -> (Ast.ParsedInput*string) -> TcConfig

val ApplyNoWarnsToTcConfig : TcConfig -> (Ast.ParsedInput * string) -> TcConfig

//----------------------------------------------------------------------------
// Scoped pragmas
Expand Down Expand Up @@ -717,23 +716,21 @@ val GetInitialTcState :
/// Check one input, returned as an Eventually computation
val TypeCheckOneInputEventually :
(unit -> bool) * TcConfig * TcImports * TcGlobals * Ast.LongIdent option * NameResolution.TcResultsSink * TcState * Ast.ParsedInput
-> Eventually<(TcEnv * TopAttribs * Tast.TypedImplFile list) * TcState>
-> Eventually<(TcEnv * TopAttribs * TypedImplFile list) * TcState>

/// Finish the checking of multiple inputs
val TypeCheckMultipleInputsFinish : (TcEnv * TopAttribs * 'T list) list * TcState -> (TcEnv * TopAttribs * 'T list) * TcState

/// Finish the checking of a closed set of inputs
val TypeCheckClosedInputSetFinish : TypedImplFile list * TcState -> TcState * TypedAssembly
val TypeCheckClosedInputSetFinish : TypedImplFile list * TcState -> TcState * TypedImplFile list

/// Check a closed set of inputs
val TypeCheckClosedInputSet :
(unit -> bool) * TcConfig * TcImports * TcGlobals * Ast.LongIdent option * TcState * Ast.ParsedInput list
-> TcState * TopAttribs * Tast.TypedAssembly * TcEnv
val TypeCheckClosedInputSet :(unit -> bool) * TcConfig * TcImports * TcGlobals * Ast.LongIdent option * TcState * Ast.ParsedInput list -> TcState * TopAttribs * TypedImplFile list * TcEnv

/// Check a single input and finish the checking
val TypeCheckSingleInputAndFinishEventually :
(unit -> bool) * TcConfig * TcImports * TcGlobals * Ast.LongIdent option * NameResolution.TcResultsSink * TcState * Ast.ParsedInput
-> Eventually<(TcEnv * TopAttribs * Tast.TypedImplFile list) * TcState>
-> Eventually<(TcEnv * TopAttribs * TypedImplFile list) * TcState>

/// Indicates if we should report a warning
val ReportWarning : globalWarnLevel: int * specificWarnOff: int list * specificWarnOn: int list -> PhasedError -> bool
Expand Down
52 changes: 26 additions & 26 deletions src/fsharp/CompileOptions.fs
Original file line number Diff line number Diff line change
Expand Up @@ -858,7 +858,7 @@ let internalFlags (tcConfigB:TcConfigBuilder) =
CompilerOption("resolutions", tagNone, OptionUnit (fun () -> tcConfigB.showReferenceResolutions <- true), Some(InternalCommandLineOption("", rangeCmdArgs)), None) // "Display assembly reference resolution information")
CompilerOption("resolutionframeworkregistrybase", tagString, OptionString (fun s -> tcConfigB.resolutionFrameworkRegistryBase<-s), Some(InternalCommandLineOption("", rangeCmdArgs)), None) // "The base registry key to use for assembly resolution. This part in brackets here: HKEY_LOCAL_MACHINE\[SOFTWARE\Microsoft\.NETFramework]\v2.0.50727\AssemblyFoldersEx")
CompilerOption("resolutionassemblyfoldersuffix", tagString, OptionString (fun s -> tcConfigB.resolutionAssemblyFoldersSuffix<-s), Some(InternalCommandLineOption("resolutionassemblyfoldersuffix", rangeCmdArgs)), None) // "The base registry key to use for assembly resolution. This part in brackets here: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v2.0.50727\[AssemblyFoldersEx]")
CompilerOption("resolutionassemblyfoldersconditions", tagString, OptionString (fun s -> tcConfigB.resolutionAssemblyFoldersConditions <- ","^s), Some(InternalCommandLineOption("resolutionassemblyfoldersconditions", rangeCmdArgs)), None) // "Additional reference resolution conditions. For example \"OSVersion=5.1.2600.0,PlatformID=id")
CompilerOption("resolutionassemblyfoldersconditions", tagString, OptionString (fun s -> tcConfigB.resolutionAssemblyFoldersConditions <- ","+s), Some(InternalCommandLineOption("resolutionassemblyfoldersconditions", rangeCmdArgs)), None) // "Additional reference resolution conditions. For example \"OSVersion=5.1.2600.0,PlatformID=id")
CompilerOption("msbuildresolution", tagNone, OptionUnit (fun () -> tcConfigB.useSimpleResolution<-false), Some(InternalCommandLineOption("msbuildresolution", rangeCmdArgs)), None) // "Resolve assembly references using MSBuild resolution rules rather than directory based (Default=true except when running fsc.exe under mono)")
CompilerOption("alwayscallvirt",tagNone,OptionSwitch(callVirtSwitch tcConfigB),Some(InternalCommandLineOption("alwayscallvirt",rangeCmdArgs)), None)
CompilerOption("nodebugdata",tagNone, OptionUnit (fun () -> tcConfigB.noDebugData<-true),Some(InternalCommandLineOption("--nodebugdata",rangeCmdArgs)), None)
Expand Down Expand Up @@ -992,7 +992,7 @@ let GetAbbrevFlagSet tcConfigB isFsc =
for c in ((if isFsc then abbreviatedFlagsFsc else abbreviatedFlagsFsi) tcConfigB) do
match c with
| CompilerOption(arg,_,OptionString _,_,_)
| CompilerOption(arg,_,OptionStringList _,_,_) -> argList <- argList @ ["-"^arg;"/"^arg]
| CompilerOption(arg,_,OptionStringList _,_,_) -> argList <- argList @ ["-"+arg;"/"+arg]
| _ -> ()
Set.ofList argList

Expand All @@ -1009,7 +1009,7 @@ let PostProcessCompilerArgs (abbrevArgs : string Set) (args : string []) =
arga.[idx] <- args.[i]
i <- i+1
else
arga.[idx] <- args.[i] ^ ":" ^ args.[i+1]
arga.[idx] <- args.[i] + ":" + args.[i+1]
i <- i + 2
idx <- idx + 1
Array.toList arga.[0 .. (idx - 1)]
Expand Down Expand Up @@ -1105,14 +1105,14 @@ let showTermFileCount = ref 0
let PrintWholeAssemblyImplementation (tcConfig:TcConfig) outfile header expr =
if tcConfig.showTerms then
if tcConfig.writeTermsToFiles then
let filename = outfile ^ ".terms"
let filename = outfile + ".terms"
let n = !showTermFileCount
showTermFileCount := n+1
use f = System.IO.File.CreateText (filename ^ "-" ^ string n ^ "-" ^ header)
Layout.outL f (Layout.squashTo 192 (DebugPrint.assemblyL expr))
use f = System.IO.File.CreateText (filename + "-" + string n + "-" + header)
Layout.outL f (Layout.squashTo 192 (DebugPrint.implFilesL expr))
else
dprintf "\n------------------\nshowTerm: %s:\n" header
Layout.outL stderr (Layout.squashTo 192 (DebugPrint.assemblyL expr))
Layout.outL stderr (Layout.squashTo 192 (DebugPrint.implFilesL expr))
dprintf "\n------------------\n"

//----------------------------------------------------------------------------
Expand Down Expand Up @@ -1206,46 +1206,45 @@ let GetInitialOptimizationEnv (tcImports:TcImports, tcGlobals:TcGlobals) =
let optEnv = List.fold (AddExternalCcuToOpimizationEnv tcGlobals) optEnv ccuinfos
optEnv

let ApplyAllOptimizations (tcConfig:TcConfig, tcGlobals, tcVal, outfile, importMap, isIncrementalFragment, optEnv, ccu:CcuThunk, tassembly:TypedAssembly) =
let ApplyAllOptimizations (tcConfig:TcConfig, tcGlobals, tcVal, outfile, importMap, isIncrementalFragment, optEnv, ccu:CcuThunk, implFiles) =
// NOTE: optEnv - threads through
//
// Always optimize once - the results of this step give the x-module optimization
// info. Subsequent optimization steps choose representations etc. which we don't
// want to save in the x-module info (i.e. x-module info is currently "high level").
PrintWholeAssemblyImplementation tcConfig outfile "pass-start" tassembly
PrintWholeAssemblyImplementation tcConfig outfile "pass-start" implFiles
#if DEBUG
if tcConfig.showOptimizationData then dprintf "Expression prior to optimization:\n%s\n" (Layout.showL (Layout.squashTo 192 (DebugPrint.assemblyL tassembly)))
if tcConfig.showOptimizationData then dprintf "Expression prior to optimization:\n%s\n" (Layout.showL (Layout.squashTo 192 (DebugPrint.implFilesL implFiles)))
if tcConfig.showOptimizationData then dprintf "CCU prior to optimization:\n%s\n" (Layout.showL (Layout.squashTo 192 (DebugPrint.entityL ccu.Contents)))
#endif

let optEnv0 = optEnv
let (TAssembly(implFiles)) = tassembly
ReportTime tcConfig ("Optimizations")

// Only do abstract_big_targets on the first pass! Only do it when TLR is on!
let optSettings = tcConfig.optSettings
let optSettings = { optSettings with abstractBigTargets = tcConfig.doTLR }
let optSettings = { optSettings with reportingPhase = true }

let results,(optEnvFirstLoop,_,_,_) =
((optEnv0,optEnv0,optEnv0,SignatureHidingInfo.Empty),implFiles) ||> List.mapFold (fun (optEnvFirstLoop,optEnvExtraLoop,optEnvFinalSimplify,hidden) implFile ->

// Only do abstract_big_targets on the first pass! Only do it when TLR is on!
let optSettings = tcConfig.optSettings
let optSettings = { optSettings with abstractBigTargets = tcConfig.doTLR }
let optSettings = { optSettings with reportingPhase = true }

//ReportTime tcConfig ("Initial simplify")
let optEnvFirstLoop,implFile,implFileOptData,hidden =
Optimizer.OptimizeImplFile(optSettings,ccu,tcGlobals,tcVal, importMap,optEnvFirstLoop,isIncrementalFragment,tcConfig.emitTailcalls,hidden,implFile)
let (optEnvFirstLoop,implFile,implFileOptData,hidden), optimizeDuringCodeGen =
Optimizer.OptimizeImplFile(optSettings,ccu,tcGlobals,tcVal,importMap,optEnvFirstLoop,isIncrementalFragment,tcConfig.emitTailcalls,hidden,implFile)

let implFile = AutoBox.TransformImplFile tcGlobals importMap implFile

// Only do this on the first pass!
let optSettings = { optSettings with abstractBigTargets = false }
let optSettings = { optSettings with reportingPhase = false }
let optSettings = { optSettings with abstractBigTargets = false; reportingPhase = false }
#if DEBUG
if tcConfig.showOptimizationData then dprintf "Optimization implFileOptData:\n%s\n" (Layout.showL (Layout.squashTo 192 (Optimizer.moduleInfoL tcGlobals implFileOptData)))
#endif

let implFile,optEnvExtraLoop =
if tcConfig.extraOptimizationIterations > 0 then
//ReportTime tcConfig ("Extra simplification loop")
let optEnvExtraLoop,implFile, _, _ = Optimizer.OptimizeImplFile(optSettings,ccu,tcGlobals,tcVal, importMap,optEnvExtraLoop,isIncrementalFragment,tcConfig.emitTailcalls,hidden,implFile)
let (optEnvExtraLoop,implFile, _, _), _ = Optimizer.OptimizeImplFile(optSettings,ccu,tcGlobals,tcVal, importMap,optEnvExtraLoop,isIncrementalFragment,tcConfig.emitTailcalls,hidden,implFile)
//PrintWholeAssemblyImplementation tcConfig outfile (sprintf "extra-loop-%d" n) implFile
implFile,optEnvExtraLoop
else
Expand All @@ -1270,20 +1269,21 @@ let ApplyAllOptimizations (tcConfig:TcConfig, tcGlobals, tcVal, outfile, importM
let implFile,optEnvFinalSimplify =
if tcConfig.doFinalSimplify then
//ReportTime tcConfig ("Final simplify pass")
let optEnvFinalSimplify,implFile, _, _ = Optimizer.OptimizeImplFile(optSettings,ccu,tcGlobals,tcVal, importMap,optEnvFinalSimplify,isIncrementalFragment,tcConfig.emitTailcalls,hidden,implFile)
let (optEnvFinalSimplify,implFile, _, _),_ = Optimizer.OptimizeImplFile(optSettings,ccu,tcGlobals,tcVal, importMap,optEnvFinalSimplify,isIncrementalFragment,tcConfig.emitTailcalls,hidden,implFile)
//PrintWholeAssemblyImplementation tcConfig outfile "post-rec-opt" implFile
implFile,optEnvFinalSimplify
else
implFile,optEnvFinalSimplify
(implFile,implFileOptData),(optEnvFirstLoop,optEnvExtraLoop,optEnvFinalSimplify,hidden))

((implFile,optimizeDuringCodeGen),implFileOptData),(optEnvFirstLoop,optEnvExtraLoop,optEnvFinalSimplify,hidden))

let implFiles,implFileOptDatas = List.unzip results
let assemblyOptData = Optimizer.UnionOptimizationInfos implFileOptDatas
let tassembly = TAssembly(implFiles)
PrintWholeAssemblyImplementation tcConfig outfile "pass-end" tassembly
let tassembly = TypedAssemblyAfterOptimization(implFiles)
PrintWholeAssemblyImplementation tcConfig outfile "pass-end" (List.map fst implFiles)
ReportTime tcConfig ("Ending Optimizations")

tassembly, assemblyOptData,optEnvFirstLoop
tassembly, assemblyOptData, optEnvFirstLoop


//----------------------------------------------------------------------------
Expand Down
4 changes: 2 additions & 2 deletions src/fsharp/CompileOptions.fsi
Original file line number Diff line number Diff line change
Expand Up @@ -81,11 +81,11 @@ val GetGeneratedILModuleName : CompilerTarget -> string -> string
#else
val GetInitialOptimizationEnv : TcImports * TcGlobals -> IncrementalOptimizationEnv
val AddExternalCcuToOpimizationEnv : TcGlobals -> IncrementalOptimizationEnv -> ImportedAssembly -> IncrementalOptimizationEnv
val ApplyAllOptimizations : TcConfig * TcGlobals * ConstraintSolver.TcValF * string * ImportMap * bool * IncrementalOptimizationEnv * CcuThunk * TypedAssembly -> TypedAssembly * Optimizer.LazyModuleInfo * IncrementalOptimizationEnv
val ApplyAllOptimizations : TcConfig * TcGlobals * ConstraintSolver.TcValF * string * ImportMap * bool * IncrementalOptimizationEnv * CcuThunk * TypedImplFile list -> TypedAssemblyAfterOptimization * Optimizer.LazyModuleInfo * IncrementalOptimizationEnv

val CreateIlxAssemblyGenerator : TcConfig * TcImports * TcGlobals * ConstraintSolver.TcValF * CcuThunk -> IlxGen.IlxAssemblyGenerator

val GenerateIlxCode : IlxGen.IlxGenBackend * bool * bool * TcConfig * TypeChecker.TopAttribs * TypedAssembly * string * bool * IlxGen.IlxAssemblyGenerator -> IlxGen.IlxGenResults
val GenerateIlxCode : IlxGen.IlxGenBackend * bool * bool * TcConfig * TypeChecker.TopAttribs * TypedAssemblyAfterOptimization * string * bool * IlxGen.IlxAssemblyGenerator -> IlxGen.IlxGenResults
#endif

// Used during static linking
Expand Down
Loading