[commit: ghc] master: TcTypeable: Don't use bogus fingerprints when suppress-uniques is enabled (786d528)

git at git.haskell.org git at git.haskell.org
Thu Dec 17 11:11:21 UTC 2015


Repository : ssh://git@git.haskell.org/ghc

On branch  : master
Link       : http://ghc.haskell.org/trac/ghc/changeset/786d528e8f949daeb62d34e0daa5e35f642065fc/ghc

>---------------------------------------------------------------

commit 786d528e8f949daeb62d34e0daa5e35f642065fc
Author: Ben Gamari <bgamari.foss at gmail.com>
Date:   Wed Dec 16 21:09:54 2015 +0100

    TcTypeable: Don't use bogus fingerprints when suppress-uniques is enabled
    
    Previously the Typeable implementation would intentionally create TyCon
    representations with bogus fingerprints to avoid fingerprints (which may
    change often) from leaking into test output. As pointed out by Richard
    in #10376 this is very bad as simply enabling a debug flag,
    `-dsuppress-uniques`, completely breaks the soundness of `Typeable`!
    
    This patch removes this behavior and replaces it with logic in the
    testsuite driver to filter out spurious changes due to Typeable
    representations.
    
    Test Plan: Validate
    
    Reviewers: austin, simonpj, goldfire
    
    Reviewed By: goldfire
    
    Subscribers: thomie
    
    Differential Revision: https://phabricator.haskell.org/D1629
    
    GHC Trac Issues: #10376


>---------------------------------------------------------------

786d528e8f949daeb62d34e0daa5e35f642065fc
 compiler/typecheck/TcTypeable.hs                      | 4 +---
 testsuite/driver/testlib.py                           | 9 +++++++++
 testsuite/tests/simplCore/should_compile/Makefile     | 3 ++-
 testsuite/tests/simplCore/should_compile/T8274.stdout | 8 ++++----
 4 files changed, 16 insertions(+), 8 deletions(-)

diff --git a/compiler/typecheck/TcTypeable.hs b/compiler/typecheck/TcTypeable.hs
index c951387..032ff79 100644
--- a/compiler/typecheck/TcTypeable.hs
+++ b/compiler/typecheck/TcTypeable.hs
@@ -194,9 +194,7 @@ mkTyConRepBinds (dflags, mod_expr, pkg_str, mod_str, tr_datacon, trn_datacon) ty
     hashThis :: String
     hashThis = unwords [pkg_str, mod_str, tycon_str]
 
-    Fingerprint high low
-       | gopt Opt_SuppressUniques dflags = Fingerprint 0 0
-       | otherwise                       = fingerprintString hashThis
+    Fingerprint high low = fingerprintString hashThis
 
     word64 :: Word64 -> HsLit
     word64 | wORD_SIZE dflags == 4 = \n -> HsWord64Prim (show n) (toInteger n)
diff --git a/testsuite/driver/testlib.py b/testsuite/driver/testlib.py
index c41bb8c..4e9a1fb 100644
--- a/testsuite/driver/testlib.py
+++ b/testsuite/driver/testlib.py
@@ -1691,12 +1691,20 @@ def normalise_callstacks(str):
     # Ignore line number differences in call stacks (#10834).
     return re.sub(', called at (.+):[\\d]+:[\\d]+ in [\\w\-\.]+:', repl, str)
 
+def normalise_type_reps(str):
+    """ Normalise out fingerprints from Typeable TyCon representations """
+    return re.sub(r'TyCon\s*\d+\#\#\s*\d+\#\#\s*',
+                  'TyCon FINGERPRINT FINGERPRINT ',
+                  str,
+                  flags=re.MULTILINE)
+
 def normalise_errmsg( str ):
     # remove " error:" and lower-case " Warning:" to make patch for
     # trac issue #10021 smaller
     str = modify_lines(str, lambda l: re.sub(' error:', '', l))
     str = modify_lines(str, lambda l: re.sub(' Warning:', ' warning:', l))
     str = normalise_callstacks(str)
+    str = normalise_type_reps(str)
 
     # If somefile ends in ".exe" or ".exe:", zap ".exe" (for Windows)
     #    the colon is there because it appears in error messages; this
@@ -1766,6 +1774,7 @@ def normalise_output( str ):
     # This can occur in error messages generated by the program.
     str = re.sub('([^\\s])\\.exe', '\\1', str)
     str = normalise_callstacks(str)
+    str = normalise_type_reps(str)
     return str
 
 def normalise_asm( str ):
diff --git a/testsuite/tests/simplCore/should_compile/Makefile b/testsuite/tests/simplCore/should_compile/Makefile
index a804768..87b1d95 100644
--- a/testsuite/tests/simplCore/should_compile/Makefile
+++ b/testsuite/tests/simplCore/should_compile/Makefile
@@ -14,7 +14,8 @@ T11155:
 
 T8274:
 	$(RM) -f T8274.o T8274.hi
-	'$(TEST_HC)' $(TEST_HC_OPTS) -O -c -ddump-simpl -dsuppress-uniques T8274.hs | grep '#'
+	# Set -dppr-cols to ensure things don't wrap
+	'$(TEST_HC)' $(TEST_HC_OPTS) -O -c -ddump-simpl -dsuppress-uniques -dppr-cols=200 T8274.hs | grep '#'
 
 T7865:
 	$(RM) -f T7865.o T7865.hi
diff --git a/testsuite/tests/simplCore/should_compile/T8274.stdout b/testsuite/tests/simplCore/should_compile/T8274.stdout
index 269f4e7..05a0069 100644
--- a/testsuite/tests/simplCore/should_compile/T8274.stdout
+++ b/testsuite/tests/simplCore/should_compile/T8274.stdout
@@ -1,12 +1,12 @@
 T8274.$trModule2 = GHC.Types.TrNameS "main"#
 T8274.$trModule1 = GHC.Types.TrNameS "T8274"#
 T8274.$tc'Positives1 = GHC.Types.TrNameS "'Positives"#
-  GHC.Types.TyCon 0## 0## T8274.$trModule T8274.$tc'Positives1
+T8274.$tc'Positives = GHC.Types.TyCon 14732531009298850569## 4925356269917933860## T8274.$trModule T8274.$tc'Positives1
 T8274.$tcP1 = GHC.Types.TrNameS "P"#
-T8274.$tcP = GHC.Types.TyCon 0## 0## T8274.$trModule T8274.$tcP1
+T8274.$tcP = GHC.Types.TyCon 11095028091707994303## 9476557054198009608## T8274.$trModule T8274.$tcP1
 T8274.$tc'Negatives1 = GHC.Types.TrNameS "'Negatives"#
-  GHC.Types.TyCon 0## 0## T8274.$trModule T8274.$tc'Negatives1
+T8274.$tc'Negatives = GHC.Types.TyCon 15950179315687996644## 11481167534507418130## T8274.$trModule T8274.$tc'Negatives1
 T8274.$tcN1 = GHC.Types.TrNameS "N"#
-T8274.$tcN = GHC.Types.TyCon 0## 0## T8274.$trModule T8274.$tcN1
+T8274.$tcN = GHC.Types.TyCon 7479687563082171902## 17616649989360543185## T8274.$trModule T8274.$tcN1
 p = T8274.Positives 42# 4.23# 4.23## '4'# 4##
 n = T8274.Negatives -4# -4.0# -4.0##



More information about the ghc-commits mailing list