summaryrefslogtreecommitdiff
path: root/testsuite/tests/determinism
diff options
context:
space:
mode:
authorBartosz Nitka <niteria@gmail.com>2015-10-27 10:19:48 -0500
committerAustin Seipp <austin@well-typed.com>2015-10-27 10:19:54 -0500
commitffcdd84f86727c1621be0a0e522eb6a3a64e479f (patch)
tree248f97aeb7af6185a78ebeb0bf9baea65681953e /testsuite/tests/determinism
parentdc13467347fa9bf9e1a70389a2eccd9bd4853d21 (diff)
downloadhaskell-ffcdd84f86727c1621be0a0e522eb6a3a64e479f.tar.gz
Sort field labels before fingerprint hashing
`fsEnvElts :: FastStringEnv a -> [a]` returns a list of `[a]` in the order of `Unique`s which is arbitrary. In this case it gives a list of record fields in arbitrary order, from which we then extract the field labels to contribute to the record fingerprint. The arbitrary ordering of field labels introduces unnecessary nondeterminism in interface files as demonstrated by the test case. We sort `FastString` here. It's safe, because the only way that the `Unique` associated with the `FastString` is used in comparison is for equality. If the `Unique`s are different it fallbacks to comparing the actual `ByteString`. Reviewed By: ezyang, thomie, bgamari, austin Differential Revision: https://phabricator.haskell.org/D1373 GHC Trac Issues: #4012
Diffstat (limited to 'testsuite/tests/determinism')
-rw-r--r--testsuite/tests/determinism/determ002/A.hs10
-rw-r--r--testsuite/tests/determinism/determ002/Makefile13
-rw-r--r--testsuite/tests/determinism/determ002/all.T4
-rw-r--r--testsuite/tests/determinism/determ002/determ002.stderr0
-rw-r--r--testsuite/tests/determinism/determ002/determ002.stdout2
5 files changed, 29 insertions, 0 deletions
diff --git a/testsuite/tests/determinism/determ002/A.hs b/testsuite/tests/determinism/determ002/A.hs
new file mode 100644
index 0000000000..9a88f2c319
--- /dev/null
+++ b/testsuite/tests/determinism/determ002/A.hs
@@ -0,0 +1,10 @@
+module A where
+
+-- This is a repro for the issue where to fingerprint a record, field labels
+-- were pulled from FastStringEnv in the order of Uniques which are known
+-- to have arbitrary order - see Note [Unique Determinism] in Unique.
+
+data B = C
+ { e :: ()
+ , d :: ()
+ }
diff --git a/testsuite/tests/determinism/determ002/Makefile b/testsuite/tests/determinism/determ002/Makefile
new file mode 100644
index 0000000000..d94a1c22ec
--- /dev/null
+++ b/testsuite/tests/determinism/determ002/Makefile
@@ -0,0 +1,13 @@
+TOP=../../..
+include $(TOP)/mk/boilerplate.mk
+include $(TOP)/mk/test.mk
+
+TEST_HC_OPTS_NO_RECOMP = $(filter-out -fforce-recomp,$(TEST_HC_OPTS))
+
+determ002:
+ $(RM) A.hi A.o
+ '$(TEST_HC)' $(TEST_HC_OPTS_NO_RECOMP) A.hs
+ $(CP) A.hi A.old.hi
+ $(RM) A.o
+ '$(TEST_HC)' $(TEST_HC_OPTS_NO_RECOMP) A.hs
+ diff A.hi A.old.hi
diff --git a/testsuite/tests/determinism/determ002/all.T b/testsuite/tests/determinism/determ002/all.T
new file mode 100644
index 0000000000..9bfd05db00
--- /dev/null
+++ b/testsuite/tests/determinism/determ002/all.T
@@ -0,0 +1,4 @@
+test('determ002',
+ extra_clean(['A.o', 'A.hi', 'A.old.hi']),
+ run_command,
+ ['$MAKE -s --no-print-directory determ002'])
diff --git a/testsuite/tests/determinism/determ002/determ002.stderr b/testsuite/tests/determinism/determ002/determ002.stderr
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/testsuite/tests/determinism/determ002/determ002.stderr
diff --git a/testsuite/tests/determinism/determ002/determ002.stdout b/testsuite/tests/determinism/determ002/determ002.stdout
new file mode 100644
index 0000000000..60c2bc368d
--- /dev/null
+++ b/testsuite/tests/determinism/determ002/determ002.stdout
@@ -0,0 +1,2 @@
+[1 of 1] Compiling A ( A.hs, A.o )
+[1 of 1] Compiling A ( A.hs, A.o )