1. 17 Jun, 2002 1 commit
  2. 07 Jun, 2002 1 commit
    • chak's avatar
      [project @ 2002-06-07 07:16:04 by chak] · 2205f0ce
      chak authored
      Fixed handling of infix operators in types:
      - Pretty printing didn't take nested infix operators into account
      - Explicit parenthesis were ignored in the fixity parser:
        * I added a constructor `HsParTy' to `HsType' (in the spirit of `HsPar' in
          `HsExpr'), which tracks the use of explicit parenthesis
        * Occurences of `HsParTy' in type-ish things that are not quite types (like
          context predicates) are removed in `ParseUtils'; all other occurences of
          `HsParTy' are removed during type checking (just as it works with `HsPar')
      2205f0ce
  3. 05 Jun, 2002 2 commits
    • simonpj's avatar
      [project @ 2002-06-05 14:39:27 by simonpj] · b2f644fa
      simonpj authored
      ---------------------------------------
      	Add rebindable syntax for do-notation
      		(this time, on the HEAD)
      	---------------------------------------
      
      Make do-notation use rebindable syntax, so that -fno-implicit-prelude
      makes do-notation use whatever (>>=), (>>), return, fail are in scope,
      rather than the Prelude versions.
      
      On the way, combine HsDo and HsDoOut into one constructor in HsSyn,
      and tidy up type checking of HsDo.
      b2f644fa
    • simonpj's avatar
      [project @ 2002-06-05 14:08:23 by simonpj] · 2145e55a
      simonpj authored
      ------------------------------------------------
      	Fix the (new) lexer, and make the derived read
      	and show code work according to the new H98 report
      	------------------------------------------------
      
      
      The new lexer, based on Koen's cunning parser (Text.ParserCombinators.ReadP)
      wasn't quite right.  It's all very cool now.
      
      In particular:
      
      * The H98 "lex" function should return the exact string parsed, and it
      now does, aided by the new combinator ReadP.gather.
      
      * As a result the Text.Read.Lex Lexeme type is much simpler than before
          data Lexeme
            = Char   Char	-- Quotes removed,
            | String String	-- 	escapes interpreted
            | Punc   String 	-- Punctuation, eg "(", "::"
            | Ident  String	-- Haskell identifiers, e.g. foo, baz
            | Symbol String	-- Haskell symbols, e.g. >>, %
            | Int Integer
            | Rat Rational
            | EOF
           deriving (Eq,Show)
      
      * Multi-character punctuation, like "::" was getting lexed as a Symbol,
      but it should be a Punc.
      
      * Parsing numbers wasn't quite right.  "1..n" got it confused because it
      got committed to a decimal point and then found a second '.'.
      
      
      * The new H98 spec for Show is there, which ignores associativity.
      2145e55a
  4. 04 Jun, 2002 1 commit
  5. 29 May, 2002 1 commit
  6. 27 May, 2002 2 commits
    • simonpj's avatar
      [project @ 2002-05-27 16:13:42 by simonpj] · fd7d044f
      simonpj authored
      Make negative literals work in patterns
      
      The issue here is that
      
      	f (-1) = True
      	f x    = False
      
      should generate
      
      	f x = x == negate (fromInteger 1)
      
      rather than
      
      	f x = x == fromInteger (-1)
      fd7d044f
    • simonpj's avatar
      [project @ 2002-05-27 15:28:07 by simonpj] · ef2b170c
      simonpj authored
      Allow infix type constructors
      
      This commit adds infix type constructors (but not yet class constructors).
      The documentation describes what should be the case.  Lots of tiresome
      changes, but nothing exciting.
      
      Allows infix type constructors everwhere a type can occur, and in a data
      or type synonym decl.  E.g.
      
      	data a :*: b = ....
      
      
      You can give fixity decls for type constructors, but the fixity decl
      applies both to the tycon and the corresponding data con.
      ef2b170c
  7. 23 May, 2002 3 commits
  8. 10 May, 2002 1 commit
    • simonpj's avatar
      [project @ 2002-05-10 12:43:02 by simonpj] · 229270a9
      simonpj authored
      If a type signature mentions a type variable that doesn't appear in
      the type, GHC was dying horribly. Example (from happy -s):
      
      	type T a = () -> ()
      
      	f :: T a
      	f () = ()
      
      This commit fixes the problem.
      229270a9
  9. 29 Apr, 2002 1 commit
    • simonmar's avatar
      [project @ 2002-04-29 14:03:38 by simonmar] · b085ee40
      simonmar authored
      FastString cleanup, stage 1.
      
      The FastString type is no longer a mixture of hashed strings and
      literal strings, it contains hashed strings only with O(1) comparison
      (except for UnicodeStr, but that will also go away in due course).  To
      create a literal instance of FastString, use FSLIT("..").
      
      By far the most common use of the old literal version of FastString
      was in the pattern
      
      	  ptext SLIT("...")
      
      this combination still works, although it doesn't go via FastString
      any more.  The next stage will be to remove the need to use this
      special combination at all, using a RULE.
      
      To convert a FastString into an SDoc, now use 'ftext' instead of
      'ptext'.
      
      I've also removed all the FAST_STRING related macros from HsVersions.h
      except for SLIT and FSLIT, just use the relevant functions from
      FastString instead.
      b085ee40
  10. 22 Apr, 2002 1 commit
  11. 11 Apr, 2002 1 commit
    • simonpj's avatar
      [project @ 2002-04-11 12:03:29 by simonpj] · a7b95beb
      simonpj authored
      -------------------
      	Mainly derived Read
      	-------------------
      
      This commit is a tangle of several things that somehow got wound up
      together, I'm afraid.
      
      
      The main course
      ~~~~~~~~~~~~~~~
      Replace the derived-Read machinery with Koen's cunning new parser
      combinator library.   The result should be
      	* much smaller code sizes from derived Read
      	* faster execution of derived Read
      
      WARNING: I have not thoroughly tested this stuff; I'd be glad if you did!
      	 All the hard work is done, but there may be a few nits.
      
      The Read class gets two new methods, not exposed
      in the H98 inteface of course:
        class Read a where
          readsPrec    :: Int -> ReadS a
          readList     :: ReadS [a]
          readPrec     :: ReadPrec a		-- NEW
          readListPrec :: ReadPrec [a]	-- NEW
      
      There are the following new libraries:
      
        Text.ParserCombinators.ReadP		Koens combinator parser
        Text.ParserCombinators.ReadPrec	Ditto, but with precedences
      
        Text.Read.Lex				An emasculated lexical analyser
      					that provides the functionality
      					of H98 'lex'
      
      TcGenDeriv is changed to generate code that uses the new libraries.
      The built-in instances of Read (List, Maybe, tuples, etc) use the new
      libraries.
      
      
      Other stuff
      ~~~~~~~~~~~
      1. Some fixes the the plumbing of external-core generation. Sigbjorn
      did most of the work earlier, but this commit completes the renaming and
      typechecking plumbing.
      
      2. Runtime error-generation functions, such as GHC.Err.recSelErr,
      GHC.Err.recUpdErr, etc, now take an Addr#, pointing to a UTF8-encoded
      C string, instead of a Haskell string.  This makes the *calls* to these
      functions easier to generate, and smaller too, which is a good thing.
      
      In particular, it means that MkId.mkRecordSelectorId doesn't need to
      be passed "unpackCStringId", which was GRUESOME; and that in turn means
      that tcTypeAndClassDecls doesn't need to be passed unf_env, which is
      a very worthwhile cleanup.   Win/win situation.
      
      3.  GHC now faithfully translates do-notation using ">>" for statements
      with no binding, just as the report says.  While I was there I tidied
      up HsDo to take a list of Ids instead of 3 (but now 4) separate Ids.
      Saves a bit of code here and there.  Also introduced Inst.newMethodFromName
      to package a common idiom.
      a7b95beb
  12. 10 Apr, 2002 1 commit
  13. 05 Apr, 2002 2 commits
    • sof's avatar
      [project @ 2002-04-05 23:24:25 by sof] · d254a44b
      sof authored
      Friday afternoon pet peeve removal: define (Util.notNull :: [a] -> Bool) and use it
      d254a44b
    • sof's avatar
      [project @ 2002-04-05 15:18:25 by sof] · acc784b5
      sof authored
      Cleaned up the way the External Core front-end was
      integrated with the rest of the compiler;
      guided by detailed and helpful feedback from Simon PJ.
      
      Input files ending in ".hcr" are now assumed to contain
      external core -- still working on getting the renamer
      to slurp in interface files (implicitly) referred to
      in the Core source.
      acc784b5
  14. 03 Apr, 2002 1 commit
    • simonpj's avatar
      [project @ 2002-04-03 09:45:14 by simonpj] · f2f40c0f
      simonpj authored
      -----------------------------
      	Put existential tyvars second
      	[fixes ParsecPerm lint error]
      	-----------------------------
      
      In an existential data constr:
      
      	data Eq a => T a = forall b. Ord b => MkT a [b]
      
      the type of MkT is
      
      	MkT :: forall a b . Ord b => a -> [b] -> MkT a
      
      Note that the existential tyvars (b in this case) come *after*
      the "ordinary" tyvars.
      
      I had switched this around earlier in the week, but I'm putting
      it back (and fixing a bug) because I found it really works better second.
      
      Reason: in a case expression we may find:
      	case (e :: T t) of { MkT b (d:Ord b) (x:t) (xs:[b]) -> ... }
      It's convenient to apply the rep-type of MkT to 't', to get
      	forall b. Ord b => ...
      and use that to check the pattern.  Mind you, this is really only
      use in CoreLint.
      f2f40c0f
  15. 02 Apr, 2002 3 commits
    • simonmar's avatar
      [project @ 2002-04-02 13:56:32 by simonmar] · 94c5c5a2
      simonmar authored
      Allow the use of 'let' for implcit bindings.
      
      Support for 'with' is left in place for the time being, but on seeing
      a 'with' we emit a non-suppressible warning about 'with' being
      deprecated in favour of 'let'.
      94c5c5a2
    • simonpj's avatar
      [project @ 2002-04-02 13:21:36 by simonpj] · 13878c13
      simonpj authored
      -----------------------------------------------------
      	Fix two nasty, subtle loops in context simplification
      	-----------------------------------------------------
      
      The context simplifier in TcSimplify was building a recursive
      dictionary, which meant the program looped when run.  The reason
      was pretty devious; in fact there are two independent causes.
      
      Cause 1
      ~~~~~~~
      Consider
       	class Eq b => Foo a b
      	instance Eq a => Foo [a] a
      If we are reducing
      	d:Foo [t] t
      we'll first deduce that it holds (via the instance decl), thus:
      	d:Foo [t] t = $fFooList deq
      	deq:Eq t = ...some rhs depending on t...
      Now we add d's superclasses.  We must not then overwrite the Eq t
      constraint with a superclass selection!!
      
      The only decent way to solve this is to track what dependencies
      a binding has; that is what the is_loop parameter to TcSimplify.addSCs
      now does.
      
      
      Cause 2
      ~~~~~~~
      This shows up when simplifying the superclass context of an
      instance declaration.  Consider
      
        class S a
      
        class S a => C a where { opc :: a -> a }
        class S b => D b where { opd :: b -> b }
      
        instance C Int where
           opc = opd
      
        instance D Int where
           opd = opc
      
      From (instance C Int) we get the constraint set {ds1:S Int, dd:D Int}
      Simplifying, we may well get:
      	$dfCInt = :C ds1 (opd dd)
      	dd  = $dfDInt
      	ds1 = $p1 dd
      Notice that we spot that we can extract ds1 from dd.
      
      Alas!  Alack! We can do the same for (instance D Int):
      
      	$dfDInt = :D ds2 (opc dc)
      	dc  = $dfCInt
      	ds2 = $p1 dc
      
      And now we've defined the superclass in terms of itself.
      
      
      Solution: treat the superclass context separately, and simplify it
      all the way down to nothing on its own.  Don't toss any 'free' parts
      out to be simplified together with other bits of context.
      
      This is done in TcInstDcls.tcSuperClasses, which is well commented.
      
      All this from a bug report from Peter White!
      13878c13
    • simonpj's avatar
      [project @ 2002-04-02 13:07:48 by simonpj] · e78b0e0e
      simonpj authored
      Error message tidy up
      e78b0e0e
  16. 01 Apr, 2002 2 commits
    • simonpj's avatar
      [project @ 2002-04-01 08:53:35 by simonpj] · 63b7e7f2
      simonpj authored
      wibble
      63b7e7f2
    • simonpj's avatar
      [project @ 2002-04-01 08:23:30 by simonpj] · 9003a18c
      simonpj authored
      ------------------------------------
      	Change the treatment of the stupid
      	   context on data constructors
      	-----------------------------------
      
      Data types can have a context:
      
      	data (Eq a, Ord b) => T a b = T1 a b | T2 a
      
      and that makes the constructors have a context too
      (notice that T2's context is "thinned"):
      
      	T1 :: (Eq a, Ord b) => a -> b -> T a b
      	T2 :: (Eq a) => a -> T a b
      
      Furthermore, this context pops up when pattern matching
      (though GHC hasn't implemented this, but it is in H98, and
      I've fixed GHC so that it now does):
      
      	f (T2 x) = x
      gets inferred type
      	f :: Eq a => T a b -> a
      
      I say the context is "stupid" because the dictionaries passed
      are immediately discarded -- they do nothing and have no benefit.
      It's a flaw in the language.
      
      Up to now I have put this stupid context into the type of
      the "wrapper" constructors functions, T1 and T2, but that turned
      out to be jolly inconvenient for generics, and record update, and
      other functions that build values of type T (because they don't
      have suitable dictionaries available).
      
      So now I've taken the stupid context out.  I simply deal with
      it separately in the type checker on occurrences of a constructor,
      either in an expression or in a pattern.
      
      To this end
      
      * Lots of changes in DataCon, MkId
      
      * New function Inst.tcInstDataCon to instantiate a data constructor
      
      
      
      I also took the opportunity to
      
      * Rename
      	dataConId --> dataConWorkId
        for consistency.
      
      * Tidied up MkId.rebuildConArgs quite a bit, and renamed it
      	mkReboxingAlt
      
      * Add function DataCon.dataConExistentialTyVars, with the obvious meaning
      9003a18c
  17. 29 Mar, 2002 1 commit
    • sof's avatar
      [project @ 2002-03-29 21:39:36 by sof] · 76293b14
      sof authored
      Front end for External Core.
      
      Initial go at implementing a Core front end
      (enabled via -fcore); work in progress (renamer
      is currently not willing to slurp in & resolve
      imports.)
      76293b14
  18. 28 Mar, 2002 1 commit
  19. 27 Mar, 2002 2 commits
  20. 26 Mar, 2002 1 commit
  21. 25 Mar, 2002 1 commit
    • simonpj's avatar
      [project @ 2002-03-25 15:08:38 by simonpj] · aaed1181
      simonpj authored
      -------------------------------
      	Fix bugs in rank-N polymorphism
      	-------------------------------
      
      Discussion with Mark showed up some bugs in the rank-N
      polymorphism stuff, especally concerning the treatment of
      'hole' type variables.
      
      See especially TcMType:
      	newHoleTyVar
      	readHoleResult
      	zapToType
      
      Also the treatment of conditionals and case branches
      is done right now, using zapToType
      aaed1181
  22. 18 Mar, 2002 2 commits
  23. 14 Mar, 2002 2 commits
    • simonmar's avatar
      [project @ 2002-03-14 15:47:52 by simonmar] · b9312420
      simonmar authored
      Remove the interface file parser, and move .hi-boot parsing into the
      main parser.  The syntax of .hi-boot files is now greatly improved in
      terms of readability; here's an example:
      
      	module M where
      	data T
      	f :: T -> GHC.Base.Int
      
      note that
      	(a) layout can be used
      	(b) there's no explcit export list; everything declared
      	    is implicitly exported
      	(c) Z-encoding of names is no longer required
      	(d) Any identifier not declared in the current module must
      	    still be quailified with the module which originally
      	    defined it (eg. GHC.Base.Int above).
      
      We'd like to relax (d), but that will come later.
      b9312420
    • simonpj's avatar
      [project @ 2002-03-14 15:27:15 by simonpj] · 1553c778
      simonpj authored
      ------------------------
      	Change
      		GlobalName --> ExternalName
      		LocalName  ->  InternalName
      	------------------------
      
      For a long time there's been terminological confusion between
      
      	GlobalName vs LocalName	 (property of a Name)
      	GlobalId vs LocalId	 (property of an Id)
      
      I've now changed the terminology for Name to be
      
      	ExternalName vs InternalName
      
      I've also added quite a bit of documentation in the Commentary.
      1553c778
  24. 12 Mar, 2002 2 commits
    • simonpj's avatar
      [project @ 2002-03-12 15:55:26 by simonpj] · 72c2f581
      simonpj authored
      ------------------------
      	Fix a type-invariant bug
      	------------------------
      
      We need to call Type.mkGenTyConApp from Type.mkAppTy, in
      case there's a partially applied type synonym.  Explanation
      with Type.mkAppTy.  All part of GHC's rather liberal treatment
      of type synonyms.
      
      Shown up by a program from Ralf Laemmel:
      
      	type Generic i o = forall x. i x -> o x
      	type Id x = x
      	comb :: Generic Id Id
      
      Test is typecheck/should_compile/tc149.hs
      72c2f581
    • simonpj's avatar
      [project @ 2002-03-12 09:12:57 by simonpj] · 49c84dec
      simonpj authored
      Comments
      49c84dec
  25. 08 Mar, 2002 1 commit
    • simonpj's avatar
      [project @ 2002-03-08 15:50:53 by simonpj] · a170160c
      simonpj authored
      --------------------------------------
      	Lift the class-method type restriction
      	--------------------------------------
      
      Haskell 98 prohibits class method types to mention constraints on the
      class type variable, thus:
      
        class Seq s a where
          fromList :: [a] -> s a
          elem     :: Eq a => a -> s a -> Bool
      
      The type of 'elem' is illegal in Haskell 98, because it contains the
      constraint 'Eq a', which constrains only the class type variable (in
      this case 'a').
      
      This commit lifts the restriction.  The way we do that is to do a full
      context reduction (tcSimplifyCheck) step for each method separately in
      TcClassDcl.tcMethodBind, rather than doing a single context reduction
      for the whole group of method bindings.
      
      As a result, I had to reorganise the code a bit, and tidy up.
      a170160c
  26. 04 Mar, 2002 1 commit
    • simonmar's avatar
      [project @ 2002-03-04 17:01:26 by simonmar] · 0171936c
      simonmar authored
      Binary Interface Files - stage 1
      --------------------------------
      
      This commit changes the default interface file format from text to
      binary, in order to improve compilation performace.
      
      To view an interface file, use 'ghc --show-iface Foo.hi'.
      
      utils/Binary.hs is the basic Binary I/O library, based on the nhc98
      binary I/O library but much stripped-down and working in terms of
      bytes rather than bits, and with some special features for GHC: it
      remembers which Module is being emitted to avoid dumping too many
      qualified names, and it keeps track of a "dictionary" of FastStrings
      so that we don't dump the same FastString more than once into the
      binary file.  I'll make a generic version of this for the libraries at
      some point.
      
      main/BinIface.hs contains most of the Binary instances.  Some
      instances are in the same module as the data type (RdrName, Name,
      OccName in particular).  Most instances were generated using a
      modified version of DrIFT, which I'll commit later.  However, editing
      them by hand isn't hard (certainly easier than modifying
      ParseIface.y).
      
      The first thing in a binary interface is the interface version, so
      nice error messages will be generated if the binary format changes and
      you still have old interfaces lying around.  The version also now
      includes the "way" as an extra sanity check.
      
      Other changes
      -------------
      
      I don't like the way FastStrings contain both hashed strings (with
      O(1) comparison) and literal C strings (with O(n) comparison).  So as
      a first step to separating these I made serveral "literal" type
      strings into hashed strings.  SLIT() still generates a literal, and
      now FSLIT() generates a hashed string.  With DEBUG on, you'll get a
      warning if you try to compare any SLIT()s with anything, and the
      compiler will fall over if you try to dump any literal C strings into
      an interface file (usually indicating a use of SLIT() which should be
      FSLIT()).
      
      mkSysLocal no longer re-encodes its FastString argument each time it
      is called.
      
      I also fixed the -pgm options so that the argument can now optionally
      be separted from the option.
      
      Bugfix: PrelNames declared Names for several comparison primops, eg.
      eqCharName, eqIntName etc. but these had different uniques from the
      real primop names.  I've moved these to PrimOps and defined them using
      mkPrimOpIdName instead, and deleted some for which we don't have real
      primops (Manuel: please check that things still work for you after
      this change).
      0171936c
  27. 28 Feb, 2002 1 commit
    • simonpj's avatar
      [project @ 2002-02-28 12:17:19 by simonpj] · 469c3333
      simonpj authored
      ---------------------------------
      	Fix a rather obscure bug in tcGen
      	---------------------------------
      
      This bug concerns deciding when a type variable "escapes",
      and hence we can't generalise it.  Our new subsumption-checking
      machinery for higher-ranked types requires a slightly
      more general approach than I had before.  The main excitement
      is in TcUnify.checkSigTyVars and its friends.
      
      As usual, I moved functions around and cleaned things up a bit;
      hence the multi-module commit.
      469c3333
  28. 27 Feb, 2002 1 commit