[commit: ghc] master: Add NegativeLiterals extension (ef73963)
Simon Peyton-Jones
simonpj at microsoft.com
Wed Jul 31 22:00:08 CEST 2013
Ian,
Thanks... but if you have added a new language extension, shouldn't you document it in the user manual? What exactly is the different behaviour seen by the user?
Simon
| -----Original Message-----
| From: ghc-commits [mailto:ghc-commits-bounces at haskell.org] On Behalf Of Ian
| Lynagh
| Sent: 31 July 2013 20:12
| To: ghc-commits at haskell.org
| Subject: [commit: ghc] master: Add NegativeLiterals extension (ef73963)
|
| Repository : http://darcs.haskell.org/ghc.git/
|
| On branch : master
|
| http://hackage.haskell.org/trac/ghc/changeset/ef739635a8c2646112d2a1fa4c871
| 5704aff1f1f
|
| >---------------------------------------------------------------
|
| commit ef739635a8c2646112d2a1fa4c8715704aff1f1f
| Author: Ian Lynagh <ian at well-typed.com>
| Date: Wed Jul 31 18:43:11 2013 +0100
|
| Add NegativeLiterals extension
|
| I'd been meaning to do this for some time, but finally got around to it
| due to the overflowing literals warning. With that enabled, we were
| getting a warning for
| -128 :: Int8
| as that is parsed as
| negate (fromInteger 128)
| which just happens to do the right thing, as
| negate (fromInteger 128) = negate (-128) = -128
|
| >---------------------------------------------------------------
|
| compiler/main/DynFlags.hs | 2 ++
| compiler/parser/Lexer.x | 17 +++++++++++++----
| compiler/utils/Util.lhs | 2 +-
| 3 files changed, 16 insertions(+), 5 deletions(-)
|
| diff --git a/compiler/main/DynFlags.hs b/compiler/main/DynFlags.hs
| index eeb48ba..9a56b50 100644
| --- a/compiler/main/DynFlags.hs
| +++ b/compiler/main/DynFlags.hs
| @@ -558,6 +558,7 @@ data ExtensionFlag
| | Opt_LambdaCase
| | Opt_MultiWayIf
| | Opt_TypeHoles
| + | Opt_NegativeLiterals
| | Opt_EmptyCase
| deriving (Eq, Enum, Show)
|
| @@ -2726,6 +2727,7 @@ xFlags = [
| ( "IncoherentInstances", Opt_IncoherentInstances, nop ),
| ( "PackageImports", Opt_PackageImports, nop ),
| ( "TypeHoles", Opt_TypeHoles, nop ),
| + ( "NegativeLiterals", Opt_NegativeLiterals, nop ),
| ( "EmptyCase", Opt_EmptyCase, nop )
| ]
|
| diff --git a/compiler/parser/Lexer.x b/compiler/parser/Lexer.x
| index 6871210..11d849a 100644
| --- a/compiler/parser/Lexer.x
| +++ b/compiler/parser/Lexer.x
| @@ -385,12 +385,16 @@ $tab+ { warn Opt_WarnTabs (text "Tab
| character") }
| -- when trying to be close to Haskell98
| <0> {
| -- Normal integral literals (:: Num a => a, from Integer)
| - @decimal { tok_num positive 0 0 decimal }
| - 0[oO] @octal { tok_num positive 2 2 octal }
| - 0[xX] @hexadecimal { tok_num positive 2 2 hexadecimal }
| + @decimal { tok_num positive 0 0
| decimal }
| + 0[oO] @octal { tok_num positive 2 2
| octal }
| + 0[xX] @hexadecimal { tok_num positive 2
| 2 hexadecimal }
| + @negative @decimal / { ifExtension negativeLiteralsEnabled } {
| tok_num negative 1 1 decimal }
| + @negative 0[oO] @octal / { ifExtension negativeLiteralsEnabled } {
| tok_num negative 3 3 octal }
| + @negative 0[xX] @hexadecimal / { ifExtension negativeLiteralsEnabled } {
| tok_num negative 3 3 hexadecimal }
|
| -- Normal rational literals (:: Fractional a => a, from Rational)
| - @floating_point { strtoken tok_float }
| + @floating_point { strtoken tok_float }
| + @negative @floating_point / { ifExtension negativeLiteralsEnabled } {
| strtoken tok_float }
| }
|
| <0> {
| @@ -1870,6 +1874,8 @@ explicitNamespacesBit :: Int
| explicitNamespacesBit = 29
| lambdaCaseBit :: Int
| lambdaCaseBit = 30
| +negativeLiteralsBit :: Int
| +negativeLiteralsBit = 31
|
|
| always :: Int -> Bool
| @@ -1925,6 +1931,8 @@ explicitNamespacesEnabled :: Int -> Bool
| explicitNamespacesEnabled flags = testBit flags explicitNamespacesBit
| lambdaCaseEnabled :: Int -> Bool
| lambdaCaseEnabled flags = testBit flags lambdaCaseBit
| +negativeLiteralsEnabled :: Int -> Bool
| +negativeLiteralsEnabled flags = testBit flags negativeLiteralsBit
|
| -- PState for parsing options pragmas
| --
| @@ -1988,6 +1996,7 @@ mkPState flags buf loc =
| .|. typeLiteralsBit `setBitIf` xopt Opt_DataKinds flags
| .|. explicitNamespacesBit `setBitIf` xopt Opt_ExplicitNamespaces
| flags
| .|. lambdaCaseBit `setBitIf` xopt Opt_LambdaCase
| flags
| + .|. negativeLiteralsBit `setBitIf` xopt Opt_NegativeLiterals
| flags
| --
| setBitIf :: Int -> Bool -> Int
| b `setBitIf` cond | cond = bit b
| diff --git a/compiler/utils/Util.lhs b/compiler/utils/Util.lhs
| index e2fd0aa..6d42ce7 100644
| --- a/compiler/utils/Util.lhs
| +++ b/compiler/utils/Util.lhs
| @@ -1095,7 +1095,7 @@ charToC w =
| hashString :: String -> Int32
| hashString = foldl' f golden
| where f m c = fromIntegral (ord c) * magic + hashInt32 m
| - magic = 0xdeadbeef
| + magic = fromIntegral (0xdeadbeef :: Word32)
|
| golden :: Int32
| golden = 1013904242 -- = round ((sqrt 5 - 1) * 2^32) :: Int32
|
|
|
| _______________________________________________
| ghc-commits mailing list
| ghc-commits at haskell.org
| http://www.haskell.org/mailman/listinfo/ghc-commits
More information about the ghc-devs
mailing list