anchor.diff:                  else
                       ResultD false)) 
   
  -and SolveRelevantMemberConstraintsForTypar (csenv:ConstraintSolverEnv) ndeep permitWeakResolution trace tp =
  +and SolveRelevantMemberConstraintsForTypar (csenv:ConstraintSolverEnv) ndeep permitWeakResolution (trace:OptionalTrace) tp =
       let cxst = csenv.SolverState.ExtraCxs
       let tpn = tp.Stamp
       let cxs = cxst.FindAll tpn
       if List.isEmpty cxs then ResultD false else
       
  -    cxs |> List.iter (fun _ -> cxst.Remove tpn);
  -
  -    assert (List.isEmpty (cxst.FindAll tpn))
  -
  -    match trace with 
  -    | NoTrace -> () 
  -    | WithTrace trace -> trace.Push (fun () -> cxs |> List.iter (fun cx -> cxst.Add(tpn,cx))) 
  +    trace.Exec (fun () -> cxs |> List.iter (fun _ -> cxst.Remove tpn)) (fun () -> cxs |> List.iter (fun cx -> cxst.Add(tpn,cx)))
  +    assert (List.isEmpty (cxst.FindAll tpn)) 
   
       cxs |> AtLeastOneD (fun (traitInfo,m2) -> 
           let csenv = { csenv with m = m2 }
  
positive.code:                          (ArgsEquivInsideUndo csenv cx.IsSome) 
                           reqdRetTyOpt 
                           calledMeth) with
            | [(calledMeth,_)] -> 
                Some calledMeth, CompleteD
  
            | _ -> 
              // Now determine the applicable methods.
  
negative.code:     | None -> tp.typar_solution <- Some (TType_measure ms)
      | Some _ -> error(InternalError("already solved",r.Range));
  
  let rec TransactStaticReq (csenv:ConstraintSolverEnv) (trace:OptionalTrace) (tpr:Typar) req = 
      let m = csenv.m
      if (tpr.Rigidity.ErrorIfUnified && tpr.StaticReq <> req) then 
          ErrorD(ConstraintSolverError(FSComp.SR.csTypeCannotBeResolvedAtCompileTime(tpr.Name),m,m)) 
      else
          let orig = tpr.StaticReq
          trace.Exec (fun () -> tpr.SetStaticReq req) (fun () -> tpr.SetStaticReq orig)
          CompleteD
  
  and SolveTypStaticReqTypar (csenv:ConstraintSolverEnv) trace req (tpr:Typar) =
  