darcs

Issue 190 crash in function new_ur

Title crash in function new_ur
Priority urgent Status resolved
Milestone Resolved in
Superseder Nosy List darcs-devel, dmitry.kurochkin, jch, kowey, simonmar, simonpj, thorkilnaur, tommy
Assigned To droundy
Topics Conflicts

Created on 2006-07-03.13:25:58 by simonmar, last changed 2009-10-23.23:36:12 by admin.

Messages
msg714 (view) Author: simonmar Date: 2006-07-03.13:25:54
We can supply failing repositories on request.

sh-2.04$ darcs --exact-version
darcs compiled on May 30 2005, at 11:54:13
# configured Mon May 30 11:48:37 USMST 2005
sh ./configure --disable-mmap --target=mingw

Context:

[update web page to reflect new stable release (1.0.3)
Tomasz Zielonka <tomasz.zielonka@gmail.com>**20050524225643] 

[TAG 1.0.3
Tomasz Zielonka <tomasz.zielonka@gmail.com>**20050524215127] 
sh-2.04$ darcs pull http://darcs.haskell.org/ghc
This is the GHC darcs repostory (HEAD branch)

For more information, visit the GHC developer wiki at
  http://hackage.haskell.org/trac/ghc
**********************

Wed May 17 16:42:04 GMT Daylight Time 2006  simonpj@microsoft.com
  * Improve pretty-printing slightly
Shall I pull this patch? (1/94) [ynWvpxqadjk], or ? for help: y


Wed May 17 16:43:04 GMT Daylight Time 2006  simonpj@microsoft.com
  * Comments only
Shall I pull this patch? (2/94) [ynWvpxqadjk], or ? for help: y


Wed May 17 16:43:49 GMT Daylight Time 2006  simonpj@microsoft.com
  * Improve pretty-printing
Shall I pull this patch? (3/94) [ynWvpxqadjk], or ? for help: y


Wed May 17 16:44:49 GMT Daylight Time 2006  simonpj@microsoft.com
  * Retain INLINE pragma information during indirection-shorting
  
  During indirection-shorting, we were dropping the InlinePragInfo,
  although were were carefully retaining strictness info etc.  
  I think this is a long-standing bug.
  
Shall I pull this patch? (4/94) [ynWvpxqadjk], or ? for help: y


Wed May 17 16:47:10 GMT Daylight Time 2006  simonpj@microsoft.com
  * Spelling correction
Shall I pull this patch? (5/94) [ynWvpxqadjk], or ? for help: a

darcs.exe: bug in darcs!
in function new_ur
Original patch:
merger 0.9 (
merger 0.0 (
hunk ./compiler/iface/IfaceSyn.lhs 633
--- gaw 2004
merger 0.0 (
hunk ./compiler/iface/IfaceSyn.lhs 589
-    rhs		= unfoldingTemplate unfold_info
-    unfold_hsinfo |  neverUnfold unfold_info 	-- The CoreTidy phase retains
unfolding info iff
-		  || has_worker = Nothing	-- we want to expose the unfolding, taking into account
-						-- unconditional NOINLINE, etc.  See TidyPgm.addExternal
-		  | otherwise	= Just (HsUnfold inline_prag (toIfaceExpr ext rhs))
+    inline_hsinfo | isAlwaysActive inline_prag     = Nothing
+		  | no_unfolding && not has_worker = Nothing
+			-- If the iface file give no unfolding info, we 
+			-- don't need to say when inlining is OK!
+		  | otherwise			   = Just (HsInline inline_prag)
merger 0.0 (
hunk ./compiler/iface/IfaceSyn.lhs 577
-    unfold_info = unfoldingInfo id_info
+    unfold_info  = unfoldingInfo id_info
+    rhs		 = unfoldingTemplate unfold_info
+    no_unfolding = neverUnfold unfold_info
+		  	-- The CoreTidy phase retains unfolding info iff
+			-- we want to expose the unfolding, taking into account
+			-- unconditional NOINLINE, etc.  See TidyPgm.addExternal
+    unfold_hsinfo | no_unfolding = Nothing			
+		  | has_worker   = Nothing	-- Unfolding is implicit
+		  | otherwise	 = Just (HsUnfold (toIfaceExpr ext rhs))
+					
+    ------------  Inline prag  --------------
merger 0.0 (
hunk ./compiler/iface/IfaceSyn.lhs 548
-	       wrkr_hsinfo,  unfold_hsinfo] 
+	       inline_hsinfo, wrkr_hsinfo,  unfold_hsinfo] 
merger 0.0 (
hunk ./compiler/iface/IfaceSyn.lhs 580
-    unfold_hsinfo |  neverUnfold unfold_info 
-		  || has_worker = Nothing
+    unfold_hsinfo |  neverUnfold unfold_info 	-- The CoreTidy phase retains
unfolding info iff
+		  || has_worker = Nothing	-- we want to expose the unfolding, taking into account
+						-- unconditional NOINLINE, etc.  See TidyPgm.addExternal
hunk ./compiler/iface/IfaceSyn.lhs 417
-\end{code}
-
-
-%************************************************************************
-%*									*
-	Converting things to their Iface equivalents
-%*									*
-%************************************************************************
-
-		 
-\begin{code}
-tyThingToIfaceDecl :: (Name -> IfaceExtName) -> TyThing -> IfaceDecl
--- Assumption: the thing is already tidied, so that locally-bound names
--- 	       (lambdas, for-alls) already have non-clashing OccNames
--- Reason: Iface stuff uses OccNames, and the conversion here does
---	   not do tidying on the way
-tyThingToIfaceDecl ext (AnId id)
-  = IfaceId { ifName   = getOccName id, 
-	      ifType   = toIfaceType ext (idType id),
-	      ifIdInfo = info }
-  where
-    info = case toIfaceIdInfo ext (idInfo id) of
-		[]    -> NoInfo
-		items -> HasInfo items
-
-tyThingToIfaceDecl ext (AClass clas)
-  = IfaceClass { ifCtxt	  = toIfaceContext ext sc_theta,
-		 ifName	  = getOccName clas,
-		 ifTyVars = toIfaceTvBndrs clas_tyvars,
-		 ifFDs    = map toIfaceFD clas_fds,
-		 ifSigs	  = map toIfaceClassOp op_stuff,
-	  	 ifRec    = boolToRecFlag (isRecursiveTyCon tycon),
-		 ifVrcs   = tyConArgVrcs tycon }
-  where
-    (clas_tyvars, clas_fds, sc_theta, _, op_stuff) = classExtraBigSig clas
-    tycon = classTyCon clas
-
-    toIfaceClassOp (sel_id, def_meth)
-	= ASSERT(sel_tyvars == clas_tyvars)
-	  IfaceClassOp (getOccName sel_id) def_meth (toIfaceType ext op_ty)
-	where
-		-- Be careful when splitting the type, because of things
-		-- like  	class Foo a where
-		--		  op :: (?x :: String) => a -> a
-		-- and  	class Baz a where
-		--		  op :: (Ord a) => a -> a
-	  (sel_tyvars, rho_ty) = splitForAllTys (idType sel_id)
-	  op_ty		       = funResultTy rho_ty
-
-    toIfaceFD (tvs1, tvs2) = (map getOccName tvs1, map getOccName tvs2)
-
-tyThingToIfaceDecl ext (ATyCon tycon)
-  | isSynTyCon tycon
-  = IfaceSyn {	ifName   = getOccName tycon,
-		ifTyVars = toIfaceTvBndrs tyvars,
-		ifVrcs    = tyConArgVrcs tycon,
-		ifSynRhs = toIfaceType ext syn_ty }
-
-  | isAlgTyCon tycon
-  = IfaceData {	ifName    = getOccName tycon,
-		ifTyVars  = toIfaceTvBndrs tyvars,
-		ifCtxt    = toIfaceContext ext (tyConStupidTheta tycon),
-		ifCons    = ifaceConDecls (algTyConRhs tycon),
-	  	ifRec     = boolToRecFlag (isRecursiveTyCon tycon),
-		ifGadtSyntax = isGadtSyntaxTyCon tycon,
-		ifVrcs    = tyConArgVrcs tycon,
-		ifGeneric = tyConHasGenerics tycon }
-
-  | isForeignTyCon tycon
-  = IfaceForeign { ifName    = getOccName tycon,
-	    	   ifExtName = tyConExtName tycon }
-
-  | isPrimTyCon tycon || isFunTyCon tycon
-	-- Needed in GHCi for ':info Int#', for example
-  = IfaceData { ifName    = getOccName tycon,
-	  	ifTyVars  = toIfaceTvBndrs (take (tyConArity tycon) alphaTyVars),
-		ifCtxt	  = [],
-		ifCons    = IfAbstractTyCon,
-		ifGadtSyntax = False,
-		ifGeneric = False,
-		ifRec     = NonRecursive,
-		ifVrcs    = tyConArgVrcs tycon }
-
-  | otherwise = pprPanic "toIfaceDecl" (ppr tycon)
-  where
-    tyvars = tyConTyVars tycon
-    syn_ty = synTyConRhs tycon
-
-    ifaceConDecls (NewTyCon { data_con = con })    = IfNewTyCon  (ifaceConDecl con)
-    ifaceConDecls (DataTyCon { data_cons = cons }) = IfDataTyCon (map
ifaceConDecl cons)
-    ifaceConDecls AbstractTyCon			   = IfAbstractTyCon
-	-- The last case happens when a TyCon has been trimmed during tidying
-	-- Furthermore, tyThingToIfaceDecl is also used
-	-- in TcRnDriver for GHCi, when browsing a module, in which case the
-	-- AbstractTyCon case is perfectly sensible.
-
-    ifaceConDecl data_con 
-	= IfCon   { ifConOcc   	 = getOccName (dataConName data_con),
-		    ifConInfix 	 = dataConIsInfix data_con,
-		    ifConUnivTvs = toIfaceTvBndrs (dataConUnivTyVars data_con),
-		    ifConExTvs   = toIfaceTvBndrs (dataConExTyVars data_con),
-		    ifConEqSpec  = to_eq_spec (dataConEqSpec data_con),
-		    ifConCtxt    = toIfaceContext ext (dataConTheta data_con),
-		    ifConArgTys  = map (toIfaceType ext) (dataConOrigArgTys data_con),
-		    ifConFields  = map getOccName (dataConFieldLabels data_con),
-		    ifConStricts = dataConStrictMarks data_con }
-
-    to_eq_spec spec = [(getOccName tv, toIfaceType ext ty) | (tv,ty) <- spec]
-
-tyThingToIfaceDecl ext (ADataCon dc)
- = pprPanic "toIfaceDecl" (ppr dc)	-- Should be trimmed out earlier
-
-
---------------------------
-instanceToIfaceInst :: (Name -> IfaceExtName) -> Instance -> IfaceInst
-instanceToIfaceInst ext_lhs ispec@(Instance { is_dfun = dfun_id, is_flag = oflag,
-					      is_cls = cls, is_tcs = mb_tcs, 
-					      is_orph = orph })
-  = IfaceInst { ifDFun    = getOccName dfun_id, 
-		ifOFlag   = oflag,
-		ifInstCls = ext_lhs cls,
-		ifInstTys = map do_rough mb_tcs,
-		ifInstOrph = orph }
-  where
-    do_rough Nothing  = Nothing
-    do_rough (Just n) = Just (toIfaceTyCon_name ext_lhs n)
-
---------------------------
-toIfaceIdInfo :: (Name -> IfaceExtName) -> IdInfo -> [IfaceInfoItem]
-toIfaceIdInfo ext id_info
-  = catMaybes [arity_hsinfo, caf_hsinfo, strict_hsinfo, 
-	       wrkr_hsinfo,  unfold_hsinfo] 
-  where
-    ------------  Arity  --------------
-    arity_info = arityInfo id_info
-    arity_hsinfo | arity_info == 0 = Nothing
-		 | otherwise       = Just (HsArity arity_info)
-
-    ------------ Caf Info --------------
-    caf_info   = cafInfo id_info
-    caf_hsinfo = case caf_info of
-		   NoCafRefs -> Just HsNoCafRefs
-		   _other    -> Nothing
-
-    ------------  Strictness  --------------
-	-- No point in explicitly exporting TopSig
-    strict_hsinfo = case newStrictnessInfo id_info of
-			Just sig | not (isTopSig sig) -> Just (HsStrictness sig)
-			_other			      -> Nothing
-
-    ------------  Worker  --------------
-    work_info   = workerInfo id_info
-    has_worker  = case work_info of { HasWorker _ _ -> True; other -> False }
-    wrkr_hsinfo = case work_info of
-		    HasWorker work_id wrap_arity -> 
-			Just (HsWorker (ext (idName work_id)) wrap_arity)
-		    NoWorker -> Nothing
-
-    ------------  Unfolding  --------------
-    -- The unfolding is redundant if there is a worker
-    unfold_info = unfoldingInfo id_info
-    inline_prag = inlinePragInfo id_info
-    rhs		= unfoldingTemplate unfold_info
-    unfold_hsinfo |  neverUnfold unfold_info 
-		  || has_worker = Nothing
-		  | otherwise	= Just (HsUnfold inline_prag (toIfaceExpr ext rhs))
-
---------------------------
-coreRuleToIfaceRule :: (Name -> IfaceExtName) 	-- For the LHS names
-		    -> (Name -> IfaceExtName) 	-- For the RHS names
-		    -> CoreRule -> IfaceRule
-coreRuleToIfaceRule ext_lhs ext_rhs (BuiltinRule { ru_fn = fn})
-  = pprTrace "toHsRule: builtin" (ppr fn) $
-    bogusIfaceRule (mkIfaceExtName fn)
-
-coreRuleToIfaceRule ext_lhs ext_rhs
-    (Rule { ru_name = name, ru_fn = fn, ru_act = act, ru_bndrs = bndrs,
-	    ru_args = args, ru_rhs = rhs, ru_orph = orph })
-  = IfaceRule { ifRuleName  = name, ifActivation = act, 
-		ifRuleBndrs = map (toIfaceBndr ext_lhs) bndrs,
-		ifRuleHead  = ext_lhs fn, 
-		ifRuleArgs  = map do_arg args,
-		ifRuleRhs   = toIfaceExpr ext_rhs rhs,
-		ifRuleOrph  = orph }
-  where
-	-- For type args we must remove synonyms from the outermost
-	-- level.  Reason: so that when we read it back in we'll
-	-- construct the same ru_rough field as we have right now;
-	-- see tcIfaceRule
-    do_arg (Type ty) = IfaceType (toIfaceType ext_lhs (deNoteType ty))
-    do_arg arg       = toIfaceExpr ext_lhs arg
-
-bogusIfaceRule :: IfaceExtName -> IfaceRule
-bogusIfaceRule id_name
-  = IfaceRule { ifRuleName = FSLIT("bogus"), ifActivation = NeverActive,  
-	ifRuleBndrs = [], ifRuleHead = id_name, ifRuleArgs = [], 
-	ifRuleRhs = IfaceExt id_name, ifRuleOrph = Nothing }
-
----------------------
-toIfaceExpr :: (Name -> IfaceExtName) -> CoreExpr -> IfaceExpr
-toIfaceExpr ext (Var v)       = toIfaceVar ext v
-toIfaceExpr ext (Lit l)       = IfaceLit l
-toIfaceExpr ext (Type ty)     = IfaceType (toIfaceType ext ty)
-toIfaceExpr ext (Lam x b)     = IfaceLam (toIfaceBndr ext x) (toIfaceExpr ext b)
-toIfaceExpr ext (App f a)     = toIfaceApp ext f [a]
--- gaw 2004
-toIfaceExpr ext (Case s x ty as) = IfaceCase (toIfaceExpr ext s) (getOccName x)
(toIfaceType ext ty) (map (toIfaceAlt ext) as)
-toIfaceExpr ext (Let b e)     = IfaceLet (toIfaceBind ext b) (toIfaceExpr ext e)
-toIfaceExpr ext (Cast e co)   = IfaceCast (toIfaceExpr ext e) (toIfaceType ext co)
-toIfaceExpr ext (Note n e)    = IfaceNote (toIfaceNote ext n) (toIfaceExpr ext e)
-
----------------------
-toIfaceNote ext (SCC cc)      = IfaceSCC cc
-toIfaceNote ext InlineCall    = IfaceInlineCall
-toIfaceNote ext InlineMe      = IfaceInlineMe
-toIfaceNote ext (CoreNote s)  = IfaceCoreNote s
-
----------------------
-toIfaceBind ext (NonRec b r) = IfaceNonRec (toIfaceIdBndr ext b) (toIfaceExpr
ext r)
-toIfaceBind ext (Rec prs)    = IfaceRec [(toIfaceIdBndr ext b, toIfaceExpr ext
r) | (b,r) <- prs]
-
----------------------
-toIfaceAlt ext (c,bs,r) = (toIfaceCon c, map getOccName bs, toIfaceExpr ext r)
-
----------------------
-toIfaceCon (DataAlt dc) | isTupleTyCon tc = IfaceTupleAlt (tupleTyConBoxity tc)
-	   		| otherwise       = IfaceDataAlt (getOccName dc)
-	   		where
-	   		  tc = dataConTyCon dc
-	   
-toIfaceCon (LitAlt l) = IfaceLitAlt l
-toIfaceCon DEFAULT    = IfaceDefault
-
----------------------
-toIfaceApp ext (App f a) as = toIfaceApp ext f (a:as)
-toIfaceApp ext (Var v) as
-  = case isDataConWorkId_maybe v of
-	-- We convert the *worker* for tuples into IfaceTuples
-	Just dc |  isTupleTyCon tc && saturated 
-		-> IfaceTuple (tupleTyConBoxity tc) tup_args
-	  where
-	    val_args  = dropWhile isTypeArg as
-	    saturated = val_args `lengthIs` idArity v
-	    tup_args  = map (toIfaceExpr ext) val_args
-	    tc	      = dataConTyCon dc
-
-        other -> mkIfaceApps ext (toIfaceVar ext v) as
-
-toIfaceApp ext e as = mkIfaceApps ext (toIfaceExpr ext e) as
-
-mkIfaceApps ext f as = foldl (\f a -> IfaceApp f (toIfaceExpr ext a)) f as
-
----------------------
-toIfaceVar :: (Name -> IfaceExtName) -> Id -> IfaceExpr
-toIfaceVar ext v 
-  | Just fcall <- isFCallId_maybe v = IfaceFCall fcall (toIfaceType ext (idType v))
-	  -- Foreign calls have special syntax
-  | isExternalName name		    = IfaceExt (ext name)
-  | otherwise			    = IfaceLcl (nameOccName name)
-  where
-    name = idName v
)
)
)
)
)
merger 0.0 (
hunk ./compiler/iface/IfaceSyn.lhs 640
---toIfaceNote ext (Coerce t1 _) = IfaceCoerce (toIfaceType ext t1)
merger 0.0 (
hunk ./compiler/iface/IfaceSyn.lhs 640
-toIfaceNote ext (Coerce t1 _) = IfaceCoerce (toIfaceType ext t1)
+--toIfaceNote ext (Coerce t1 _) = IfaceCoerce (toIfaceType ext t1)
hunk ./compiler/iface/IfaceSyn.lhs 641
-toIfaceNote ext InlineCall    = IfaceInlineCall
)
)
)
Unwound:
merger 0.9 (
merger 0.0 (
hunk ./compiler/iface/IfaceSyn.lhs 633
--- gaw 2004
merger 0.0 (
hunk ./compiler/iface/IfaceSyn.lhs 589
-    rhs		= unfoldingTemplate unfold_info
-    unfold_hsinfo |  neverUnfold unfold_info 	-- The CoreTidy phase retains
unfolding info iff
-		  || has_worker = Nothing	-- we want to expose the unfolding, taking into account
-						-- unconditional NOINLINE, etc.  See TidyPgm.addExternal
-		  | otherwise	= Just (HsUnfold inline_prag (toIfaceExpr ext rhs))
+    inline_hsinfo | isAlwaysActive inline_prag     = Nothing
+		  | no_unfolding && not has_worker = Nothing
+			-- If the iface file give no unfolding info, we 
+			-- don't need to say when inlining is OK!
+		  | otherwise			   = Just (HsInline inline_prag)
merger 0.0 (
hunk ./compiler/iface/IfaceSyn.lhs 577
-    unfold_info = unfoldingInfo id_info
+    unfold_info  = unfoldingInfo id_info
+    rhs		 = unfoldingTemplate unfold_info
+    no_unfolding = neverUnfold unfold_info
+		  	-- The CoreTidy phase retains unfolding info iff
+			-- we want to expose the unfolding, taking into account
+			-- unconditional NOINLINE, etc.  See TidyPgm.addExternal
+    unfold_hsinfo | no_unfolding = Nothing			
+		  | has_worker   = Nothing	-- Unfolding is implicit
+		  | otherwise	 = Just (HsUnfold (toIfaceExpr ext rhs))
+					
+    ------------  Inline prag  --------------
merger 0.0 (
hunk ./compiler/iface/IfaceSyn.lhs 548
-	       wrkr_hsinfo,  unfold_hsinfo] 
+	       inline_hsinfo, wrkr_hsinfo,  unfold_hsinfo] 
merger 0.0 (
hunk ./compiler/iface/IfaceSyn.lhs 580
-    unfold_hsinfo |  neverUnfold unfold_info 
-		  || has_worker = Nothing
+    unfold_hsinfo |  neverUnfold unfold_info 	-- The CoreTidy phase retains
unfolding info iff
+		  || has_worker = Nothing	-- we want to expose the unfolding, taking into account
+						-- unconditional NOINLINE, etc.  See TidyPgm.addExternal
hunk ./compiler/iface/IfaceSyn.lhs 417
-\end{code}
-
-
-%************************************************************************
-%*									*
-	Converting things to their Iface equivalents
-%*									*
-%************************************************************************
-
-		 
-\begin{code}
-tyThingToIfaceDecl :: (Name -> IfaceExtName) -> TyThing -> IfaceDecl
--- Assumption: the thing is already tidied, so that locally-bound names
--- 	       (lambdas, for-alls) already have non-clashing OccNames
--- Reason: Iface stuff uses OccNames, and the conversion here does
---	   not do tidying on the way
-tyThingToIfaceDecl ext (AnId id)
-  = IfaceId { ifName   = getOccName id, 
-	      ifType   = toIfaceType ext (idType id),
-	      ifIdInfo = info }
-  where
-    info = case toIfaceIdInfo ext (idInfo id) of
-		[]    -> NoInfo
-		items -> HasInfo items
-
-tyThingToIfaceDecl ext (AClass clas)
-  = IfaceClass { ifCtxt	  = toIfaceContext ext sc_theta,
-		 ifName	  = getOccName clas,
-		 ifTyVars = toIfaceTvBndrs clas_tyvars,
-		 ifFDs    = map toIfaceFD clas_fds,
-		 ifSigs	  = map toIfaceClassOp op_stuff,
-	  	 ifRec    = boolToRecFlag (isRecursiveTyCon tycon),
-		 ifVrcs   = tyConArgVrcs tycon }
-  where
-    (clas_tyvars, clas_fds, sc_theta, _, op_stuff) = classExtraBigSig clas
-    tycon = classTyCon clas
-
-    toIfaceClassOp (sel_id, def_meth)
-	= ASSERT(sel_tyvars == clas_tyvars)
-	  IfaceClassOp (getOccName sel_id) def_meth (toIfaceType ext op_ty)
-	where
-		-- Be careful when splitting the type, because of things
-		-- like  	class Foo a where
-		--		  op :: (?x :: String) => a -> a
-		-- and  	class Baz a where
-		--		  op :: (Ord a) => a -> a
-	  (sel_tyvars, rho_ty) = splitForAllTys (idType sel_id)
-	  op_ty		       = funResultTy rho_ty
-
-    toIfaceFD (tvs1, tvs2) = (map getOccName tvs1, map getOccName tvs2)
-
-tyThingToIfaceDecl ext (ATyCon tycon)
-  | isSynTyCon tycon
-  = IfaceSyn {	ifName   = getOccName tycon,
-		ifTyVars = toIfaceTvBndrs tyvars,
-		ifVrcs    = tyConArgVrcs tycon,
-		ifSynRhs = toIfaceType ext syn_ty }
-
-  | isAlgTyCon tycon
-  = IfaceData {	ifName    = getOccName tycon,
-		ifTyVars  = toIfaceTvBndrs tyvars,
-		ifCtxt    = toIfaceContext ext (tyConStupidTheta tycon),
-		ifCons    = ifaceConDecls (algTyConRhs tycon),
-	  	ifRec     = boolToRecFlag (isRecursiveTyCon tycon),
-		ifGadtSyntax = isGadtSyntaxTyCon tycon,
-		ifVrcs    = tyConArgVrcs tycon,
-		ifGeneric = tyConHasGenerics tycon }
-
-  | isForeignTyCon tycon
-  = IfaceForeign { ifName    = getOccName tycon,
-	    	   ifExtName = tyConExtName tycon }
-
-  | isPrimTyCon tycon || isFunTyCon tycon
-	-- Needed in GHCi for ':info Int#', for example
-  = IfaceData { ifName    = getOccName tycon,
-	  	ifTyVars  = toIfaceTvBndrs (take (tyConArity tycon) alphaTyVars),
-		ifCtxt	  = [],
-		ifCons    = IfAbstractTyCon,
-		ifGadtSyntax = False,
-		ifGeneric = False,
-		ifRec     = NonRecursive,
-		ifVrcs    = tyConArgVrcs tycon }
-
-  | otherwise = pprPanic "toIfaceDecl" (ppr tycon)
-  where
-    tyvars = tyConTyVars tycon
-    syn_ty = synTyConRhs tycon
-
-    ifaceConDecls (NewTyCon { data_con = con })    = IfNewTyCon  (ifaceConDecl con)
-    ifaceConDecls (DataTyCon { data_cons = cons }) = IfDataTyCon (map
ifaceConDecl cons)
-    ifaceConDecls AbstractTyCon			   = IfAbstractTyCon
-	-- The last case happens when a TyCon has been trimmed during tidying
-	-- Furthermore, tyThingToIfaceDecl is also used
-	-- in TcRnDriver for GHCi, when browsing a module, in which case the
-	-- AbstractTyCon case is perfectly sensible.
-
-    ifaceConDecl data_con 
-	= IfCon   { ifConOcc   	 = getOccName (dataConName data_con),
-		    ifConInfix 	 = dataConIsInfix data_con,
-		    ifConUnivTvs = toIfaceTvBndrs (dataConUnivTyVars data_con),
-		    ifConExTvs   = toIfaceTvBndrs (dataConExTyVars data_con),
-		    ifConEqSpec  = to_eq_spec (dataConEqSpec data_con),
-		    ifConCtxt    = toIfaceContext ext (dataConTheta data_con),
-		    ifConArgTys  = map (toIfaceType ext) (dataConOrigArgTys data_con),
-		    ifConFields  = map getOccName (dataConFieldLabels data_con),
-		    ifConStricts = dataConStrictMarks data_con }
-
-    to_eq_spec spec = [(getOccName tv, toIfaceType ext ty) | (tv,ty) <- spec]
-
-tyThingToIfaceDecl ext (ADataCon dc)
- = pprPanic "toIfaceDecl" (ppr dc)	-- Should be trimmed out earlier
-
-
---------------------------
-instanceToIfaceInst :: (Name -> IfaceExtName) -> Instance -> IfaceInst
-instanceToIfaceInst ext_lhs ispec@(Instance { is_dfun = dfun_id, is_flag = oflag,
-					      is_cls = cls, is_tcs = mb_tcs, 
-					      is_orph = orph })
-  = IfaceInst { ifDFun    = getOccName dfun_id, 
-		ifOFlag   = oflag,
-		ifInstCls = ext_lhs cls,
-		ifInstTys = map do_rough mb_tcs,
-		ifInstOrph = orph }
-  where
-    do_rough Nothing  = Nothing
-    do_rough (Just n) = Just (toIfaceTyCon_name ext_lhs n)
-
---------------------------
-toIfaceIdInfo :: (Name -> IfaceExtName) -> IdInfo -> [IfaceInfoItem]
-toIfaceIdInfo ext id_info
-  = catMaybes [arity_hsinfo, caf_hsinfo, strict_hsinfo, 
-	       wrkr_hsinfo,  unfold_hsinfo] 
-  where
-    ------------  Arity  --------------
-    arity_info = arityInfo id_info
-    arity_hsinfo | arity_info == 0 = Nothing
-		 | otherwise       = Just (HsArity arity_info)
-
-    ------------ Caf Info --------------
-    caf_info   = cafInfo id_info
-    caf_hsinfo = case caf_info of
-		   NoCafRefs -> Just HsNoCafRefs
-		   _other    -> Nothing
-
-    ------------  Strictness  --------------
-	-- No point in explicitly exporting TopSig
-    strict_hsinfo = case newStrictnessInfo id_info of
-			Just sig | not (isTopSig sig) -> Just (HsStrictness sig)
-			_other			      -> Nothing
-
-    ------------  Worker  --------------
-    work_info   = workerInfo id_info
-    has_worker  = case work_info of { HasWorker _ _ -> True; other -> False }
-    wrkr_hsinfo = case work_info of
-		    HasWorker work_id wrap_arity -> 
-			Just (HsWorker (ext (idName work_id)) wrap_arity)
-		    NoWorker -> Nothing
-
-    ------------  Unfolding  --------------
-    -- The unfolding is redundant if there is a worker
-    unfold_info = unfoldingInfo id_info
-    inline_prag = inlinePragInfo id_info
-    rhs		= unfoldingTemplate unfold_info
-    unfold_hsinfo |  neverUnfold unfold_info 
-		  || has_worker = Nothing
-		  | otherwise	= Just (HsUnfold inline_prag (toIfaceExpr ext rhs))
-
---------------------------
-coreRuleToIfaceRule :: (Name -> IfaceExtName) 	-- For the LHS names
-		    -> (Name -> IfaceExtName) 	-- For the RHS names
-		    -> CoreRule -> IfaceRule
-coreRuleToIfaceRule ext_lhs ext_rhs (BuiltinRule { ru_fn = fn})
-  = pprTrace "toHsRule: builtin" (ppr fn) $
-    bogusIfaceRule (mkIfaceExtName fn)
-
-coreRuleToIfaceRule ext_lhs ext_rhs
-    (Rule { ru_name = name, ru_fn = fn, ru_act = act, ru_bndrs = bndrs,
-	    ru_args = args, ru_rhs = rhs, ru_orph = orph })
-  = IfaceRule { ifRuleName  = name, ifActivation = act, 
-		ifRuleBndrs = map (toIfaceBndr ext_lhs) bndrs,
-		ifRuleHead  = ext_lhs fn, 
-		ifRuleArgs  = map do_arg args,
-		ifRuleRhs   = toIfaceExpr ext_rhs rhs,
-		ifRuleOrph  = orph }
-  where
-	-- For type args we must remove synonyms from the outermost
-	-- level.  Reason: so that when we read it back in we'll
-	-- construct the same ru_rough field as we have right now;
-	-- see tcIfaceRule
-    do_arg (Type ty) = IfaceType (toIfaceType ext_lhs (deNoteType ty))
-    do_arg arg       = toIfaceExpr ext_lhs arg
-
-bogusIfaceRule :: IfaceExtName -> IfaceRule
-bogusIfaceRule id_name
-  = IfaceRule { ifRuleName = FSLIT("bogus"), ifActivation = NeverActive,  
-	ifRuleBndrs = [], ifRuleHead = id_name, ifRuleArgs = [], 
-	ifRuleRhs = IfaceExt id_name, ifRuleOrph = Nothing }
-
----------------------
-toIfaceExpr :: (Name -> IfaceExtName) -> CoreExpr -> IfaceExpr
-toIfaceExpr ext (Var v)       = toIfaceVar ext v
-toIfaceExpr ext (Lit l)       = IfaceLit l
-toIfaceExpr ext (Type ty)     = IfaceType (toIfaceType ext ty)
-toIfaceExpr ext (Lam x b)     = IfaceLam (toIfaceBndr ext x) (toIfaceExpr ext b)
-toIfaceExpr ext (App f a)     = toIfaceApp ext f [a]
--- gaw 2004
-toIfaceExpr ext (Case s x ty as) = IfaceCase (toIfaceExpr ext s) (getOccName x)
(toIfaceType ext ty) (map (toIfaceAlt ext) as)
-toIfaceExpr ext (Let b e)     = IfaceLet (toIfaceBind ext b) (toIfaceExpr ext e)
-toIfaceExpr ext (Cast e co)   = IfaceCast (toIfaceExpr ext e) (toIfaceType ext co)
-toIfaceExpr ext (Note n e)    = IfaceNote (toIfaceNote ext n) (toIfaceExpr ext e)
-
----------------------
-toIfaceNote ext (SCC cc)      = IfaceSCC cc
-toIfaceNote ext InlineCall    = IfaceInlineCall
-toIfaceNote ext InlineMe      = IfaceInlineMe
-toIfaceNote ext (CoreNote s)  = IfaceCoreNote s
-
----------------------
-toIfaceBind ext (NonRec b r) = IfaceNonRec (toIfaceIdBndr ext b) (toIfaceExpr
ext r)
-toIfaceBind ext (Rec prs)    = IfaceRec [(toIfaceIdBndr ext b, toIfaceExpr ext
r) | (b,r) <- prs]
-
----------------------
-toIfaceAlt ext (c,bs,r) = (toIfaceCon c, map getOccName bs, toIfaceExpr ext r)
-
----------------------
-toIfaceCon (DataAlt dc) | isTupleTyCon tc = IfaceTupleAlt (tupleTyConBoxity tc)
-	   		| otherwise       = IfaceDataAlt (getOccName dc)
-	   		where
-	   		  tc = dataConTyCon dc
-	   
-toIfaceCon (LitAlt l) = IfaceLitAlt l
-toIfaceCon DEFAULT    = IfaceDefault
-
----------------------
-toIfaceApp ext (App f a) as = toIfaceApp ext f (a:as)
-toIfaceApp ext (Var v) as
-  = case isDataConWorkId_maybe v of
-	-- We convert the *worker* for tuples into IfaceTuples
-	Just dc |  isTupleTyCon tc && saturated 
-		-> IfaceTuple (tupleTyConBoxity tc) tup_args
-	  where
-	    val_args  = dropWhile isTypeArg as
-	    saturated = val_args `lengthIs` idArity v
-	    tup_args  = map (toIfaceExpr ext) val_args
-	    tc	      = dataConTyCon dc
-
-        other -> mkIfaceApps ext (toIfaceVar ext v) as
-
-toIfaceApp ext e as = mkIfaceApps ext (toIfaceExpr ext e) as
-
-mkIfaceApps ext f as = foldl (\f a -> IfaceApp f (toIfaceExpr ext a)) f as
-
----------------------
-toIfaceVar :: (Name -> IfaceExtName) -> Id -> IfaceExpr
-toIfaceVar ext v 
-  | Just fcall <- isFCallId_maybe v = IfaceFCall fcall (toIfaceType ext (idType v))
-	  -- Foreign calls have special syntax
-  | isExternalName name		    = IfaceExt (ext name)
-  | otherwise			    = IfaceLcl (nameOccName name)
-  where
-    name = idName v
)
)
)
)
)
merger 0.0 (
hunk ./compiler/iface/IfaceSyn.lhs 640
---toIfaceNote ext (Coerce t1 _) = IfaceCoerce (toIfaceType ext t1)
merger 0.0 (
hunk ./compiler/iface/IfaceSyn.lhs 640
-toIfaceNote ext (Coerce t1 _) = IfaceCoerce (toIfaceType ext t1)
+--toIfaceNote ext (Coerce t1 _) = IfaceCoerce (toIfaceType ext t1)
hunk ./compiler/iface/IfaceSyn.lhs 641
-toIfaceNote ext InlineCall    = IfaceInlineCall
)
)
)
merger 0.0 (
hunk ./compiler/iface/IfaceSyn.lhs 633
--- gaw 2004
merger 0.0 (
hunk ./compiler/iface/IfaceSyn.lhs 589
-    rhs		= unfoldingTemplate unfold_info
-    unfold_hsinfo |  neverUnfold unfold_info 	-- The CoreTidy phase retains
unfolding info iff
-		  || has_worker = Nothing	-- we want to expose the unfolding, taking into account
-						-- unconditional NOINLINE, etc.  See TidyPgm.addExternal
-		  | otherwise	= Just (HsUnfold inline_prag (toIfaceExpr ext rhs))
+    inline_hsinfo | isAlwaysActive inline_prag     = Nothing
+		  | no_unfolding && not has_worker = Nothing
+			-- If the iface file give no unfolding info, we 
+			-- don't need to say when inlining is OK!
+		  | otherwise			   = Just (HsInline inline_prag)
merger 0.0 (
hunk ./compiler/iface/IfaceSyn.lhs 577
-    unfold_info = unfoldingInfo id_info
+    unfold_info  = unfoldingInfo id_info
+    rhs		 = unfoldingTemplate unfold_info
+    no_unfolding = neverUnfold unfold_info
+		  	-- The CoreTidy phase retains unfolding info iff
+			-- we want to expose the unfolding, taking into account
+			-- unconditional NOINLINE, etc.  See TidyPgm.addExternal
+    unfold_hsinfo | no_unfolding = Nothing			
+		  | has_worker   = Nothing	-- Unfolding is implicit
+		  | otherwise	 = Just (HsUnfold (toIfaceExpr ext rhs))
+					
+    ------------  Inline prag  --------------
merger 0.0 (
hunk ./compiler/iface/IfaceSyn.lhs 548
-	       wrkr_hsinfo,  unfold_hsinfo] 
+	       inline_hsinfo, wrkr_hsinfo,  unfold_hsinfo] 
merger 0.0 (
hunk ./compiler/iface/IfaceSyn.lhs 580
-    unfold_hsinfo |  neverUnfold unfold_info 
-		  || has_worker = Nothing
+    unfold_hsinfo |  neverUnfold unfold_info 	-- The CoreTidy phase retains
unfolding info iff
+		  || has_worker = Nothing	-- we want to expose the unfolding, taking into account
+						-- unconditional NOINLINE, etc.  See TidyPgm.addExternal
hunk ./compiler/iface/IfaceSyn.lhs 417
-\end{code}
-
-
-%************************************************************************
-%*									*
-	Converting things to their Iface equivalents
-%*									*
-%************************************************************************
-
-		 
-\begin{code}
-tyThingToIfaceDecl :: (Name -> IfaceExtName) -> TyThing -> IfaceDecl
--- Assumption: the thing is already tidied, so that locally-bound names
--- 	       (lambdas, for-alls) already have non-clashing OccNames
--- Reason: Iface stuff uses OccNames, and the conversion here does
---	   not do tidying on the way
-tyThingToIfaceDecl ext (AnId id)
-  = IfaceId { ifName   = getOccName id, 
-	      ifType   = toIfaceType ext (idType id),
-	      ifIdInfo = info }
-  where
-    info = case toIfaceIdInfo ext (idInfo id) of
-		[]    -> NoInfo
-		items -> HasInfo items
-
-tyThingToIfaceDecl ext (AClass clas)
-  = IfaceClass { ifCtxt	  = toIfaceContext ext sc_theta,
-		 ifName	  = getOccName clas,
-		 ifTyVars = toIfaceTvBndrs clas_tyvars,
-		 ifFDs    = map toIfaceFD clas_fds,
-		 ifSigs	  = map toIfaceClassOp op_stuff,
-	  	 ifRec    = boolToRecFlag (isRecursiveTyCon tycon),
-		 ifVrcs   = tyConArgVrcs tycon }
-  where
-    (clas_tyvars, clas_fds, sc_theta, _, op_stuff) = classExtraBigSig clas
-    tycon = classTyCon clas
-
-    toIfaceClassOp (sel_id, def_meth)
-	= ASSERT(sel_tyvars == clas_tyvars)
-	  IfaceClassOp (getOccName sel_id) def_meth (toIfaceType ext op_ty)
-	where
-		-- Be careful when splitting the type, because of things
-		-- like  	class Foo a where
-		--		  op :: (?x :: String) => a -> a
-		-- and  	class Baz a where
-		--		  op :: (Ord a) => a -> a
-	  (sel_tyvars, rho_ty) = splitForAllTys (idType sel_id)
-	  op_ty		       = funResultTy rho_ty
-
-    toIfaceFD (tvs1, tvs2) = (map getOccName tvs1, map getOccName tvs2)
-
-tyThingToIfaceDecl ext (ATyCon tycon)
-  | isSynTyCon tycon
-  = IfaceSyn {	ifName   = getOccName tycon,
-		ifTyVars = toIfaceTvBndrs tyvars,
-		ifVrcs    = tyConArgVrcs tycon,
-		ifSynRhs = toIfaceType ext syn_ty }
-
-  | isAlgTyCon tycon
-  = IfaceData {	ifName    = getOccName tycon,
-		ifTyVars  = toIfaceTvBndrs tyvars,
-		ifCtxt    = toIfaceContext ext (tyConStupidTheta tycon),
-		ifCons    = ifaceConDecls (algTyConRhs tycon),
-	  	ifRec     = boolToRecFlag (isRecursiveTyCon tycon),
-		ifGadtSyntax = isGadtSyntaxTyCon tycon,
-		ifVrcs    = tyConArgVrcs tycon,
-		ifGeneric = tyConHasGenerics tycon }
-
-  | isForeignTyCon tycon
-  = IfaceForeign { ifName    = getOccName tycon,
-	    	   ifExtName = tyConExtName tycon }
-
-  | isPrimTyCon tycon || isFunTyCon tycon
-	-- Needed in GHCi for ':info Int#', for example
-  = IfaceData { ifName    = getOccName tycon,
-	  	ifTyVars  = toIfaceTvBndrs (take (tyConArity tycon) alphaTyVars),
-		ifCtxt	  = [],
-		ifCons    = IfAbstractTyCon,
-		ifGadtSyntax = False,
-		ifGeneric = False,
-		ifRec     = NonRecursive,
-		ifVrcs    = tyConArgVrcs tycon }
-
-  | otherwise = pprPanic "toIfaceDecl" (ppr tycon)
-  where
-    tyvars = tyConTyVars tycon
-    syn_ty = synTyConRhs tycon
-
-    ifaceConDecls (NewTyCon { data_con = con })    = IfNewTyCon  (ifaceConDecl con)
-    ifaceConDecls (DataTyCon { data_cons = cons }) = IfDataTyCon (map
ifaceConDecl cons)
-    ifaceConDecls AbstractTyCon			   = IfAbstractTyCon
-	-- The last case happens when a TyCon has been trimmed during tidying
-	-- Furthermore, tyThingToIfaceDecl is also used
-	-- in TcRnDriver for GHCi, when browsing a module, in which case the
-	-- AbstractTyCon case is perfectly sensible.
-
-    ifaceConDecl data_con 
-	= IfCon   { ifConOcc   	 = getOccName (dataConName data_con),
-		    ifConInfix 	 = dataConIsInfix data_con,
-		    ifConUnivTvs = toIfaceTvBndrs (dataConUnivTyVars data_con),
-		    ifConExTvs   = toIfaceTvBndrs (dataConExTyVars data_con),
-		    ifConEqSpec  = to_eq_spec (dataConEqSpec data_con),
-		    ifConCtxt    = toIfaceContext ext (dataConTheta data_con),
-		    ifConArgTys  = map (toIfaceType ext) (dataConOrigArgTys data_con),
-		    ifConFields  = map getOccName (dataConFieldLabels data_con),
-		    ifConStricts = dataConStrictMarks data_con }
-
-    to_eq_spec spec = [(getOccName tv, toIfaceType ext ty) | (tv,ty) <- spec]
-
-tyThingToIfaceDecl ext (ADataCon dc)
- = pprPanic "toIfaceDecl" (ppr dc)	-- Should be trimmed out earlier
-
-
---------------------------
-instanceToIfaceInst :: (Name -> IfaceExtName) -> Instance -> IfaceInst
-instanceToIfaceInst ext_lhs ispec@(Instance { is_dfun = dfun_id, is_flag = oflag,
-					      is_cls = cls, is_tcs = mb_tcs, 
-					      is_orph = orph })
-  = IfaceInst { ifDFun    = getOccName dfun_id, 
-		ifOFlag   = oflag,
-		ifInstCls = ext_lhs cls,
-		ifInstTys = map do_rough mb_tcs,
-		ifInstOrph = orph }
-  where
-    do_rough Nothing  = Nothing
-    do_rough (Just n) = Just (toIfaceTyCon_name ext_lhs n)
-
---------------------------
-toIfaceIdInfo :: (Name -> IfaceExtName) -> IdInfo -> [IfaceInfoItem]
-toIfaceIdInfo ext id_info
-  = catMaybes [arity_hsinfo, caf_hsinfo, strict_hsinfo, 
-	       wrkr_hsinfo,  unfold_hsinfo] 
-  where
-    ------------  Arity  --------------
-    arity_info = arityInfo id_info
-    arity_hsinfo | arity_info == 0 = Nothing
-		 | otherwise       = Just (HsArity arity_info)
-
-    ------------ Caf Info --------------
-    caf_info   = cafInfo id_info
-    caf_hsinfo = case caf_info of
-		   NoCafRefs -> Just HsNoCafRefs
-		   _other    -> Nothing
-
-    ------------  Strictness  --------------
-	-- No point in explicitly exporting TopSig
-    strict_hsinfo = case newStrictnessInfo id_info of
-			Just sig | not (isTopSig sig) -> Just (HsStrictness sig)
-			_other			      -> Nothing
-
-    ------------  Worker  --------------
-    work_info   = workerInfo id_info
-    has_worker  = case work_info of { HasWorker _ _ -> True; other -> False }
-    wrkr_hsinfo = case work_info of
-		    HasWorker work_id wrap_arity -> 
-			Just (HsWorker (ext (idName work_id)) wrap_arity)
-		    NoWorker -> Nothing
-
-    ------------  Unfolding  --------------
-    -- The unfolding is redundant if there is a worker
-    unfold_info = unfoldingInfo id_info
-    inline_prag = inlinePragInfo id_info
-    rhs		= unfoldingTemplate unfold_info
-    unfold_hsinfo |  neverUnfold unfold_info 
-		  || has_worker = Nothing
-		  | otherwise	= Just (HsUnfold inline_prag (toIfaceExpr ext rhs))
-
---------------------------
-coreRuleToIfaceRule :: (Name -> IfaceExtName) 	-- For the LHS names
-		    -> (Name -> IfaceExtName) 	-- For the RHS names
-		    -> CoreRule -> IfaceRule
-coreRuleToIfaceRule ext_lhs ext_rhs (BuiltinRule { ru_fn = fn})
-  = pprTrace "toHsRule: builtin" (ppr fn) $
-    bogusIfaceRule (mkIfaceExtName fn)
-
-coreRuleToIfaceRule ext_lhs ext_rhs
-    (Rule { ru_name = name, ru_fn = fn, ru_act = act, ru_bndrs = bndrs,
-	    ru_args = args, ru_rhs = rhs, ru_orph = orph })
-  = IfaceRule { ifRuleName  = name, ifActivation = act, 
-		ifRuleBndrs = map (toIfaceBndr ext_lhs) bndrs,
-		ifRuleHead  = ext_lhs fn, 
-		ifRuleArgs  = map do_arg args,
-		ifRuleRhs   = toIfaceExpr ext_rhs rhs,
-		ifRuleOrph  = orph }
-  where
-	-- For type args we must remove synonyms from the outermost
-	-- level.  Reason: so that when we read it back in we'll
-	-- construct the same ru_rough field as we have right now;
-	-- see tcIfaceRule
-    do_arg (Type ty) = IfaceType (toIfaceType ext_lhs (deNoteType ty))
-    do_arg arg       = toIfaceExpr ext_lhs arg
-
-bogusIfaceRule :: IfaceExtName -> IfaceRule
-bogusIfaceRule id_name
-  = IfaceRule { ifRuleName = FSLIT("bogus"), ifActivation = NeverActive,  
-	ifRuleBndrs = [], ifRuleHead = id_name, ifRuleArgs = [], 
-	ifRuleRhs = IfaceExt id_name, ifRuleOrph = Nothing }
-
----------------------
-toIfaceExpr :: (Name -> IfaceExtName) -> CoreExpr -> IfaceExpr
-toIfaceExpr ext (Var v)       = toIfaceVar ext v
-toIfaceExpr ext (Lit l)       = IfaceLit l
-toIfaceExpr ext (Type ty)     = IfaceType (toIfaceType ext ty)
-toIfaceExpr ext (Lam x b)     = IfaceLam (toIfaceBndr ext x) (toIfaceExpr ext b)
-toIfaceExpr ext (App f a)     = toIfaceApp ext f [a]
--- gaw 2004
-toIfaceExpr ext (Case s x ty as) = IfaceCase (toIfaceExpr ext s) (getOccName x)
(toIfaceType ext ty) (map (toIfaceAlt ext) as)
-toIfaceExpr ext (Let b e)     = IfaceLet (toIfaceBind ext b) (toIfaceExpr ext e)
-toIfaceExpr ext (Cast e co)   = IfaceCast (toIfaceExpr ext e) (toIfaceType ext co)
-toIfaceExpr ext (Note n e)    = IfaceNote (toIfaceNote ext n) (toIfaceExpr ext e)
-
----------------------
-toIfaceNote ext (SCC cc)      = IfaceSCC cc
-toIfaceNote ext InlineCall    = IfaceInlineCall
-toIfaceNote ext InlineMe      = IfaceInlineMe
-toIfaceNote ext (CoreNote s)  = IfaceCoreNote s
-
----------------------
-toIfaceBind ext (NonRec b r) = IfaceNonRec (toIfaceIdBndr ext b) (toIfaceExpr
ext r)
-toIfaceBind ext (Rec prs)    = IfaceRec [(toIfaceIdBndr ext b, toIfaceExpr ext
r) | (b,r) <- prs]
-
----------------------
-toIfaceAlt ext (c,bs,r) = (toIfaceCon c, map getOccName bs, toIfaceExpr ext r)
-
----------------------
-toIfaceCon (DataAlt dc) | isTupleTyCon tc = IfaceTupleAlt (tupleTyConBoxity tc)
-	   		| otherwise       = IfaceDataAlt (getOccName dc)
-	   		where
-	   		  tc = dataConTyCon dc
-	   
-toIfaceCon (LitAlt l) = IfaceLitAlt l
-toIfaceCon DEFAULT    = IfaceDefault
-
----------------------
-toIfaceApp ext (App f a) as = toIfaceApp ext f (a:as)
-toIfaceApp ext (Var v) as
-  = case isDataConWorkId_maybe v of
-	-- We convert the *worker* for tuples into IfaceTuples
-	Just dc |  isTupleTyCon tc && saturated 
-		-> IfaceTuple (tupleTyConBoxity tc) tup_args
-	  where
-	    val_args  = dropWhile isTypeArg as
-	    saturated = val_args `lengthIs` idArity v
-	    tup_args  = map (toIfaceExpr ext) val_args
-	    tc	      = dataConTyCon dc
-
-        other -> mkIfaceApps ext (toIfaceVar ext v) as
-
-toIfaceApp ext e as = mkIfaceApps ext (toIfaceExpr ext e) as
-
-mkIfaceApps ext f as = foldl (\f a -> IfaceApp f (toIfaceExpr ext a)) f as
-
----------------------
-toIfaceVar :: (Name -> IfaceExtName) -> Id -> IfaceExpr
-toIfaceVar ext v 
-  | Just fcall <- isFCallId_maybe v = IfaceFCall fcall (toIfaceType ext (idType v))
-	  -- Foreign calls have special syntax
-  | isExternalName name		    = IfaceExt (ext name)
-  | otherwise			    = IfaceLcl (nameOccName name)
-  where
-    name = idName v
)
)
)
)
)
hunk ./compiler/iface/IfaceSyn.lhs 633
--- gaw 2004
hunk ./compiler/iface/IfaceSyn.lhs 589
-    rhs		= unfoldingTemplate unfold_info
-    unfold_hsinfo |  neverUnfold unfold_info 	-- The CoreTidy phase retains
unfolding info iff
-		  || has_worker = Nothing	-- we want to expose the unfolding, taking into account
-						-- unconditional NOINLINE, etc.  See TidyPgm.addExternal
-		  | otherwise	= Just (HsUnfold inline_prag (toIfaceExpr ext rhs))
+    inline_hsinfo | isAlwaysActive inline_prag     = Nothing
+		  | no_unfolding && not has_worker = Nothing
+			-- If the iface file give no unfolding info, we 
+			-- don't need to say when inlining is OK!
+		  | otherwise			   = Just (HsInline inline_prag)
hunk ./compiler/iface/IfaceSyn.lhs 577
-    unfold_info = unfoldingInfo id_info
+    unfold_info  = unfoldingInfo id_info
+    rhs		 = unfoldingTemplate unfold_info
+    no_unfolding = neverUnfold unfold_info
+		  	-- The CoreTidy phase retains unfolding info iff
+			-- we want to expose the unfolding, taking into account
+			-- unconditional NOINLINE, etc.  See TidyPgm.addExternal
+    unfold_hsinfo | no_unfolding = Nothing			
+		  | has_worker   = Nothing	-- Unfolding is implicit
+		  | otherwise	 = Just (HsUnfold (toIfaceExpr ext rhs))
+					
+    ------------  Inline prag  --------------
hunk ./compiler/iface/IfaceSyn.lhs 548
-	       wrkr_hsinfo,  unfold_hsinfo] 
+	       inline_hsinfo, wrkr_hsinfo,  unfold_hsinfo] 
hunk ./compiler/iface/IfaceSyn.lhs 580
-    unfold_hsinfo |  neverUnfold unfold_info 
-		  || has_worker = Nothing
+    unfold_hsinfo |  neverUnfold unfold_info 	-- The CoreTidy phase retains
unfolding info iff
+		  || has_worker = Nothing	-- we want to expose the unfolding, taking into account
+						-- unconditional NOINLINE, etc.  See TidyPgm.addExternal
hunk ./compiler/iface/IfaceSyn.lhs 650
---toIfaceNote ext (Coerce t1 _) = IfaceCoerce (toIfaceType ext t1)
hunk ./compiler/iface/IfaceSyn.lhs 630
-toIfaceNote ext (Coerce t1 _) = IfaceCoerce (toIfaceType ext t1)
+--toIfaceNote ext (Coerce t1 _) = IfaceCoerce (toIfaceType ext t1)
Please report this to bugs@darcs.net
If possible include the output of 'darcs --exact-version'.
sh-2.04$
msg718 (view) Author: jch Date: 2006-07-03.15:34:17
Simon,

Both bugs 190 and 191 are a problem with commuting mergers.

As you doubtless know, Darcs works by commuting patches around.  While
we do believe that the commutation rules that Darcs uses are correct,
we have no proof of that fact.  What is more, we do know that they are
not complete -- commutation does fail in some cases.

What you see is commutation failing.  While this is a bug, it is not
critical: nothing has been corrupted, but the merge cannot complete.

I have encountered this situation exactly twice in two years' working
with Darcs.  I solved the problem once by doing a manual merge (darcs diff
followed with patch), and once by manually hacking a repository.  Both
solutions are suboptimal, for various reasons, I recommend the first
one as being simpler.

I may be wrong, but I fear that the only person competent to fix this
problem is David.  I wouldn't hold my breath -- I recommend going
ahead and doing a manual merge.

                                        Juliusz
msg719 (view) Author: jch Date: 2006-07-03.18:03:41
From: Juliusz Chroboczek <jch@pps.jussieu.fr>
Date: Mon, 03 Jul 2006 20:03:05 +0200
Message-ID: <87ac7q36sm.fsf@pps.jussieu.fr>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
--text follows this line--
Simon P.-J. :

> I understand your solution A as follows.  
> 
> In the main reposiitory:
>       darcs diff -p 'The offending patch' > patchfile
> 
> Transport 'patchfile' to the variant repository.  Then:
>       patch < patchfile
> 
> Now record this patch and push it back to the main repository
>       darcs record (with patchname 'Duplicate offending patch')
>       darcs push -a

Not quite.

In the variant repository,

  darcs diff -u --patch='The offending patch' > patchfile

In the main repository

  patch -p1 < patchfile
  -- fix merge conflicts
  darcs record -a

In the variant repository

  darcs unpull --patches='The offending patch'
  darcs pull

However, you may find out that the last darcs pull fails (up to
symmetry, it's the same commutation as the one that failed in the
first place).  If so, I suggest that you discard the variant
repository and rebuild it from scratch.

In order to avoid spurious merge conflicts, you will have to make sure
that every person who ever pulled from the variant repository either
unpulls the (now obsolete) patch, or does a fresh darcs get.  My
solution to this issue is to put a human-readable warning in

  _darcs/prefs/motd

Hope this helps,

                                        Juliusz
msg758 (view) Author: simonpj Date: 2006-07-04.09:35:37
| Not quite.
| 
| In the variant repository,
| 
|   darcs diff -u --patch='The offending patch' > patchfile

I'm afraid the offending patch is in the main respository!  (It's only
"offending" because an attempt to pull it into the variant repository
makes darcs crash.)

The bug shows when I sit in the variant repository and try to apply new
patches from the main respository to the variant, thus
	darcs pull -p 'The offending patch'

In that context, I'm not sure how to apply your instructions.

Perhaps I should await guidance from David?  Meanwhile I'm not actually
stuck.

Simon
msg759 (view) Author: droundy Date: 2006-07-04.10:10:44
On Tue, Jul 04, 2006 at 09:35:40AM +0000, simonpj wrote:
> simonpj <simonpj@microsoft.com> added the comment:
> 
> | Not quite.
> | 
> | In the variant repository,
> | 
> |   darcs diff -u --patch='The offending patch' > patchfile
> 
> I'm afraid the offending patch is in the main respository!  (It's only
> "offending" because an attempt to pull it into the variant repository
> makes darcs crash.)
> 
> The bug shows when I sit in the variant repository and try to apply new
> patches from the main respository to the variant, thus
> 	darcs pull -p 'The offending patch'
> 
> In that context, I'm not sure how to apply your instructions.
> 
> Perhaps I should await guidance from David?  Meanwhile I'm not actually
> stuck.
> 
> Simon

I'll be able to look at this today.  I'm heading into the office today
(even though it's a holiday over here), but since it's a holiday, I'll
not restrict myself to working on "work" during the day.  It may be
that many patches are involved, in which case you may need to do some
excessive trickery.  :(

I really need to get those conflictors working.  I've had some good
ideas recently, but not much time to work on them, and no *complete*
ideas, just ideas for directions to explore.  Right now I'm just
looking to check my morning email, and then I'll eat breakfast, read
my Bible, and get onto darcs work (which first thing means looking at
your conflict).
-- 
David Roundy
msg760 (view) Author: simonpj Date: 2006-07-04.10:30:50
David

| I'll be able to look at this today.  I'm heading into the office today
| (even though it's a holiday over here), but since it's a holiday, I'll
| not restrict myself to working on "work" during the day.

Thank you.  I know you have plenty else to do.  It's not an immediate show-stopper (i.e. I can happily continue working for days or even a couple of weeks).   

However, even if it's not fixable -- Simon tells me you've been thinking about this problem for some time -- it would be very useful to have clear guidance about the most constructive way to work around it.  I don’t understand Darcs well enough to be confident of how to work around.

Simon
msg761 (view) Author: simonmar Date: 2006-07-04.10:37:52
On 04 July 2006 11:11, David Roundy wrote:

> David Roundy <droundy@darcs.net> added the comment:
> 
> On Tue, Jul 04, 2006 at 09:35:40AM +0000, simonpj wrote:
>> simonpj <simonpj@microsoft.com> added the comment:
>> 
>>> Not quite.
>>> 
>>> In the variant repository,
>>> 
>>>   darcs diff -u --patch='The offending patch' > patchfile
>> 
>> I'm afraid the offending patch is in the main respository!  (It's
>> only "offending" because an attempt to pull it into the variant
>> repository makes darcs crash.) 
>> 
>> The bug shows when I sit in the variant repository and try to apply
>> new patches from the main respository to the variant, thus
>> 	darcs pull -p 'The offending patch'
>> 
>> In that context, I'm not sure how to apply your instructions.
>> 
>> Perhaps I should await guidance from David?  Meanwhile I'm not
>> actually stuck. 
>> 
>> Simon
> 
> I'll be able to look at this today.  I'm heading into the office today
> (even though it's a holiday over here), but since it's a holiday, I'll
> not restrict myself to working on "work" during the day.  It may be
> that many patches are involved, in which case you may need to do some
> excessive trickery.  :(
> 
> I really need to get those conflictors working.  I've had some good
> ideas recently, but not much time to work on them, and no *complete*
> ideas, just ideas for directions to explore.  Right now I'm just
> looking to check my morning email, and then I'll eat breakfast, read
> my Bible, and get onto darcs work (which first thing means looking at
> your conflict).

Thanks David (and Juliusz), we appreciate the effort.

Right now, my rule of thumb, having lurked on darcs-users and
darcs-devel for a while, is to avoid resolving conflicts by recording
more patches, if at all possible.

Simon complains, quite rightly, that this is hard in general -
especially when the patch that conflicts has a bunch of dependencies,
you might end up having to re-do a whole tree of patches.  I think
that's the situation we're in right now.

One short-term improvement that might be useful is to at least improve
the error message: something along the lines of "darcs couldn't merge
patch P, suggest merging manually", or "darcs couldn't figure out how to
combine patches P & Q, suggest merging manually".

Cheers,
	Simon
msg762 (view) Author: droundy Date: 2006-07-04.11:15:27
On Tue, Jul 04, 2006 at 11:37:37AM +0100, Simon Marlow wrote:
> Thanks David (and Juliusz), we appreciate the effort.
> 
> Right now, my rule of thumb, having lurked on darcs-users and
> darcs-devel for a while, is to avoid resolving conflicts by recording
> more patches, if at all possible.

Yeah, thats a good way to avoid running into this bug.  Recording a
new patch, however, *ought* to be the correct way to deal with a
conflict.

> Simon complains, quite rightly, that this is hard in general -
> especially when the patch that conflicts has a bunch of dependencies,
> you might end up having to re-do a whole tree of patches.  I think
> that's the situation we're in right now.

Indeed, and he's quite right.  It's definitely an unacceptable bug,
and this is precisely why--there's often no decent solution.  In the
case of 191, there seems to be a sequence of 62 patches that conflict
with the one patch in the mainline repo, which is quite a pain--you
certainly don't want to lose all that history.  I'm looking now to see
which of those patches are truly problematic, and which have "safe"
conflicts.

> One short-term improvement that might be useful is to at least improve
> the error message: something along the lines of "darcs couldn't merge
> patch P, suggest merging manually", or "darcs couldn't figure out how to
> combine patches P & Q, suggest merging manually".

Indeed, that would help users to understand what's going on.
-- 
David Roundy
msg2321 (view) Author: droundy Date: 2008-01-05.15:22:34
I'm marking this as resolved-in-unstable, since the darcs-2 format (and patch
logic) fixes this.
History
Date User Action Args
2006-07-03 13:25:58simonmarcreate
2006-07-03 15:28:24jchsetstatus: unread -> unknown
nosy: + jch
2006-07-03 15:34:20jchsetnosy: droundy, jch, tommy, simonmar
messages: + msg718
2006-07-03 18:03:44jchsetnosy: droundy, jch, tommy, simonmar
messages: + msg719
2006-07-03 20:41:28droundysetnosy: droundy, jch, tommy, simonmar
2006-07-04 09:35:40simonpjsetnosy: + simonpj
messages: + msg758
2006-07-04 10:10:48droundysetnosy: droundy, jch, tommy, simonmar, simonpj
messages: + msg759
2006-07-04 10:30:53simonpjsetnosy: droundy, jch, tommy, simonmar, simonpj
messages: + msg760
2006-07-04 10:37:55simonmarsetnosy: droundy, jch, tommy, simonmar, simonpj
messages: + msg761
2006-07-04 11:15:31droundysetnosy: droundy, jch, tommy, simonmar, simonpj
messages: + msg762
2007-07-23 14:00:30koweysettopic: + Conflicts
nosy: + kowey, beschmi
2008-01-05 15:22:35droundysetstatus: unknown -> resolved-in-unstable
messages: + msg2321
2008-09-04 21:28:23adminsetstatus: resolved-in-unstable -> resolved
nosy: + dagit
2009-08-06 17:43:04adminsetnosy: + markstos, jast, Serware, dmitry.kurochkin, darcs-devel, zooko, mornfall, simon, thorkilnaur, - droundy, jch, simonmar, simonpj
2009-08-06 20:40:06adminsetnosy: - beschmi
2009-08-10 21:52:08adminsetnosy: + simonmar, jch, simonpj, - markstos, darcs-devel, zooko, jast, Serware, mornfall
2009-08-10 23:54:31adminsetnosy: - dagit
2009-08-25 17:56:21adminsetnosy: + darcs-devel, - simon
2009-08-27 14:04:26adminsetnosy: jch, tommy, kowey, darcs-devel, simonmar, simonpj, thorkilnaur, dmitry.kurochkin
2009-10-23 22:37:44adminsetnosy: + marlowsd, - simonmar
2009-10-23 23:36:12adminsetnosy: + simonmar, - marlowsd