Correct off by one error in ghci +c
authorMatthew Pickering <matthewtpickering@gmail.com>
Wed, 17 Apr 2019 16:56:56 +0000 (17:56 +0100)
committerMarge Bot <ben+marge-bot@smart-cactus.org>
Mon, 22 Apr 2019 18:37:30 +0000 (14:37 -0400)
Fixes #16569

ghc/GHCi/UI.hs
ghc/GHCi/UI/Info.hs
testsuite/tests/ghci/scripts/T16569.hs [new file with mode: 0644]
testsuite/tests/ghci/scripts/T16569.script [new file with mode: 0644]
testsuite/tests/ghci/scripts/T16569.stdout [new file with mode: 0644]
testsuite/tests/ghci/scripts/all.T
testsuite/tests/ghci/should_run/T15369.stdout

index 21ef796..383b7fe 100644 (file)
@@ -2146,7 +2146,9 @@ parseSpanArg s = do
 
     let fs    = mkFastString fp
         span' = mkRealSrcSpan (mkRealSrcLoc fs sl sc)
 
     let fs    = mkFastString fp
         span' = mkRealSrcSpan (mkRealSrcLoc fs sl sc)
-                              (mkRealSrcLoc fs el ec)
+                              -- End column of RealSrcSpan is the column
+                              -- after the end of the span.
+                              (mkRealSrcLoc fs el (ec + 1))
 
     return (span',trailer)
   where
 
     return (span',trailer)
   where
@@ -2192,7 +2194,9 @@ showRealSrcSpan spn = concat [ fp, ":(", show sl, ",", show sc
     sl = srcSpanStartLine spn
     sc = srcSpanStartCol  spn
     el = srcSpanEndLine   spn
     sl = srcSpanStartLine spn
     sc = srcSpanStartCol  spn
     el = srcSpanEndLine   spn
-    ec = srcSpanEndCol    spn
+    -- The end column is the column after the end of the span see the
+    -- RealSrcSpan module
+    ec = let ec' = srcSpanEndCol    spn in if ec' == 0 then 0 else ec' - 1
 
 -----------------------------------------------------------------------------
 -- | @:kind@ command
 
 -----------------------------------------------------------------------------
 -- | @:kind@ command
index d42f019..2bf061f 100644 (file)
@@ -75,6 +75,9 @@ data SpanInfo = SpanInfo
       -- locality, definition location, etc.
     }
 
       -- locality, definition location, etc.
     }
 
+instance Outputable SpanInfo where
+  ppr (SpanInfo s t i) = ppr s <+> ppr t <+> ppr i
+
 -- | Test whether second span is contained in (or equal to) first span.
 -- This is basically 'containsSpan' for 'SpanInfo'
 containsSpanInfo :: SpanInfo -> SpanInfo -> Bool
 -- | Test whether second span is contained in (or equal to) first span.
 -- This is basically 'containsSpan' for 'SpanInfo'
 containsSpanInfo :: SpanInfo -> SpanInfo -> Bool
diff --git a/testsuite/tests/ghci/scripts/T16569.hs b/testsuite/tests/ghci/scripts/T16569.hs
new file mode 100644 (file)
index 0000000..af7c49f
--- /dev/null
@@ -0,0 +1,4 @@
+module T16569 where
+
+main :: IO ()
+main = putStrLn (case (undefined :: Int) of _ -> undefined)
diff --git a/testsuite/tests/ghci/scripts/T16569.script b/testsuite/tests/ghci/scripts/T16569.script
new file mode 100644 (file)
index 0000000..cc8b2e6
--- /dev/null
@@ -0,0 +1,3 @@
+:set +c
+:l T16569.hs
+::type-at T16569.hs 4 8 4 59
diff --git a/testsuite/tests/ghci/scripts/T16569.stdout b/testsuite/tests/ghci/scripts/T16569.stdout
new file mode 100644 (file)
index 0000000..957a0ff
--- /dev/null
@@ -0,0 +1,2 @@
+Collecting type info for 1 module(s) ... 
+ :: IO ()
index eb0a3a5..c2d9d9f 100755 (executable)
@@ -295,3 +295,4 @@ test('T16089', normal, ghci_script, ['T16089.script'])
 test('T14828', normal, ghci_script, ['T14828.script'])
 test('T16376', normal, ghci_script, ['T16376.script'])
 test('T16527', normal, ghci_script, ['T16527.script'])
 test('T14828', normal, ghci_script, ['T14828.script'])
 test('T16376', normal, ghci_script, ['T16376.script'])
 test('T16527', normal, ghci_script, ['T16527.script'])
+test('T16569', normal, ghci_script, ['T16569.script'])
index 0bb004c..fbea615 100644 (file)
@@ -1,8 +1,8 @@
 Collecting type info for 1 module(s) ... 
 Collecting type info for 1 module(s) ... 
-T15369.hs:(3,1)-(3,2): GHC.Types.Int
-T15369.hs:(3,5)-(3,6): GHC.Types.Int
-T15369.hs:(3,1)-(3,2): GHC.Types.Int
-T15369.hs:(3,5)-(3,6): GHC.Types.Int
+T15369.hs:(3,1)-(3,1): GHC.Types.Int
+T15369.hs:(3,5)-(3,5): GHC.Types.Int
+T15369.hs:(3,1)-(3,1): GHC.Types.Int
+T15369.hs:(3,5)-(3,5): GHC.Types.Int
 Collecting type info for 1 module(s) ... 
 Collecting type info for 1 module(s) ... 
-T15369.hs:(3,1)-(3,2): GHC.Types.Double
-T15369.hs:(3,5)-(3,6): GHC.Types.Double
+T15369.hs:(3,1)-(3,1): GHC.Types.Double
+T15369.hs:(3,5)-(3,5): GHC.Types.Double