
#14030: Implement the "Derive Lift instances for data types in template-haskell" proposal -------------------------------------+------------------------------------- Reporter: RyanGlScott | Owner: RyanGlScott Type: task | Status: new Priority: normal | Milestone: 8.8.1 Component: Template Haskell | Version: 8.3 Resolution: | Keywords: deriving Operating System: Unknown/Multiple | Architecture: | Unknown/Multiple Type of failure: None/Unknown | Test Case: Blocked By: | Blocking: Related Tickets: | Differential Rev(s): Wiki Page: | -------------------------------------+------------------------------------- Comment (by RyanGlScott): OK, I decided that I wanted to remember exactly what the error message was, so I compiled GHC 8.4.4 using 8.2.2 as the bootstrapping compiler. Here is the error that I got: {{{ $ PATH=/opt/ghc/8.2.2/bin:$PATH make -j1 ===--- building phase 0 make --no-print-directory -f ghc.mk phase=0 phase_0_builds make[1]: Nothing to be done for 'phase_0_builds'. ===--- building phase 1 make --no-print-directory -f ghc.mk phase=1 phase_1_builds "/opt/ghc/8.2.2/bin/ghc" -hisuf hi -osuf o -hcsuf hc -static -O0 -H64m -Wall -package-db libraries/bootstrapping.conf -this-unit-id template- haskell-2.13.0.0 -hide-all-packages -i -ilibraries/template-haskell/. -ilibraries/template-haskell/dist-boot/build -Ilibraries/template-haskell /dist-boot/build -ilibraries/template-haskell/dist-boot/build/./autogen -Ilibraries/template-haskell/dist-boot/build/./autogen -Ilibraries /template-haskell/. -optP-include -optPlibraries/template-haskell/dist- boot/build/./autogen/cabal_macros.h -package-id base-4.10.1.0 -package-id ghc-boot-th-8.4.4 -package-id pretty-1.1.3.3 -Wall -this-unit-id template- haskell -XHaskell2010 -no-user-package-db -rtsopts -fno-warn- deprecated-flags -odir libraries/template-haskell/dist-boot/build -hidir libraries/template-haskell/dist-boot/build -stubdir libraries /template-haskell/dist-boot/build -c libraries/template- haskell/./Language/Haskell/TH/Syntax.hs -o libraries/template-haskell /dist-boot/build/Language/Haskell/TH/Syntax.o libraries/template-haskell/Language/Haskell/TH/Syntax.hs:2002:43: error: • Failed to load interface for ‘Language.Haskell.TH.Lib’ Use -v to see a list of the files searched for. • In the expression: Language.Haskell.TH.Lib.conE (mkNameG_d "template-haskell" "Language.Haskell.TH.Syntax" "NominalR") In an equation for ‘lift’: lift NominalR = Language.Haskell.TH.Lib.conE (mkNameG_d "template-haskell" "Language.Haskell.TH.Syntax" "NominalR") When typechecking the code for ‘lift’ in a derived instance for ‘Lift Role’: To see the code I am typechecking, use -ddump-deriv In the instance declaration for ‘Lift Role’ | 2002 | deriving( Show, Eq, Ord, Data, Generic, Lift ) | ^^^^ libraries/template-haskell/ghc.mk:3: recipe for target 'libraries /template-haskell/dist-boot/build/Language/Haskell/TH/Syntax.o' failed make[1]: *** [libraries/template-haskell/dist- boot/build/Language/Haskell/TH/Syntax.o] Error 1 Makefile:122: recipe for target 'all' failed make: *** [all] Error 2 }}} If you pass `-v`, you'll see what the culprit is: {{{ $ "/opt/ghc/8.2.2/bin/ghc" -hisuf hi -osuf o -hcsuf hc -static -O0 -H64m -Wall -package-db libraries/bootstrapping.conf -this-unit-id template- haskell-2.13.0.0 -hide-all-packages -i -ilibraries/template-haskell/. -ilibraries/template-haskell/dist-boot/build -Ilibraries/template-haskell /dist-boot/build -ilibraries/template-haskell/dist-boot/build/./autogen -Ilibraries/template-haskell/dist-boot/build/./autogen -Ilibraries /template-haskell/. -optP-include -optPlibraries/template-haskell/dist- boot/build/./autogen/cabal_macros.h -package-id base-4.10.1.0 -package-id ghc-boot-th-8.4.4 -package-id pretty-1.1.3.3 -Wall -this-unit-id template- haskell -XHaskell2010 -no-user-package-db -rtsopts -fno-warn- deprecated-flags -odir libraries/template-haskell/dist-boot/build -hidir libraries/template-haskell/dist-boot/build -stubdir libraries /template-haskell/dist-boot/build -c libraries/template- haskell/./Language/Haskell/TH/Syntax.hs -o libraries/template-haskell /dist-boot/build/Language/Haskell/TH/Syntax.o -v Glasgow Haskell Compiler, Version 8.2.2, stage 2 booted by GHC version 8.0.2 Using binary package database: /opt/ghc/8.2.2/lib/ghc-8.2.2/package.conf.d/package.cache Using binary package database: libraries/bootstrapping.conf/package.cache package flags [-package-id base-4.10.1.0{unit base-4.10.1.0 True ([])}, -package-id ghc-boot-th-8.4.4{unit ghc-boot-th-8.4.4 True ([])}, -package-id pretty-1.1.3.3{unit pretty-1.1.3.3 True ([])}] loading package database /opt/ghc/8.2.2/lib/ghc-8.2.2/package.conf.d loading package database libraries/bootstrapping.conf package binary-0.8.5.1 overrides a previously defined package package hpc-0.6.0.3 overrides a previously defined package package Cabal-2.0.1.0 is unusable due to shadowed dependencies: binary-0.8.5.1 package ghc-8.2.2 is unusable due to shadowed dependencies: binary-0.8.5.1 hpc-0.6.0.3 ghc-boot-8.2.2 ghci-8.2.2 package ghc-boot-8.2.2 is unusable due to shadowed dependencies: binary-0.8.5.1 package ghci-8.2.2 is unusable due to shadowed dependencies: binary-0.8.5.1 ghc-boot-8.2.2 wired-in package ghc-prim mapped to ghc-prim-0.5.1.1 wired-in package integer-gmp mapped to integer-gmp-1.0.1.0 wired-in package base mapped to base-4.10.1.0 wired-in package rts mapped to rts wired-in package template-haskell mapped to template-haskell-2.13.0.0 wired-in package ghc mapped to ghc-8.4.4 wired-in package dph-seq not found. wired-in package dph-par not found. *** Checking old interface for Language.Haskell.TH.Syntax (use -ddump-hi- diffs for more details): *** Parser [Language.Haskell.TH.Syntax]: !!! Parser [Language.Haskell.TH.Syntax]: finished in 25.95 milliseconds, allocated 36.318 megabytes *** Renamer/typechecker [Language.Haskell.TH.Syntax]: !!! Renamer/typechecker [Language.Haskell.TH.Syntax]: finished in 775.89 milliseconds, allocated 669.498 megabytes libraries/template-haskell/Language/Haskell/TH/Syntax.hs:2002:43: error: • Failed to load interface for ‘Language.Haskell.TH.Lib’ Locations searched: libraries/template-haskell/./Language/Haskell/TH/Lib.hi libraries/template-haskell/./Language/Haskell/TH/Lib.hi-boot libraries/template-haskell/dist- boot/build/Language/Haskell/TH/Lib.hi libraries/template-haskell/dist-boot/build/Language/Haskell/TH/Lib .hi-boot libraries/template-haskell/dist- boot/build/./autogen/Language/Haskell/TH/Lib.hi libraries/template-haskell/dist- boot/build/./autogen/Language/Haskell/TH/Lib.hi-boot • In the expression: Language.Haskell.TH.Lib.conE (mkNameG_d "template-haskell" "Language.Haskell.TH.Syntax" "NominalR") In an equation for ‘lift’: lift NominalR = Language.Haskell.TH.Lib.conE (mkNameG_d "template-haskell" "Language.Haskell.TH.Syntax" "NominalR") When typechecking the code for ‘lift’ in a derived instance for ‘Lift Role’: To see the code I am typechecking, use -ddump-deriv In the instance declaration for ‘Lift Role’ | 2002 | deriving( Show, Eq, Ord, Data, Generic, Lift ) | ^^^^ *** Deleting temp files: Deleting: *** Deleting temp dirs: Deleting: }}} It appears as though GHC is searching in through the interface files of the stage-1 GHC (8.4.4), but using the bootstrapping compiler's (8.2.2's) `DeriveLift` name information to determine where to search! This adds more evidence to my belief that this is quite fragile. I'm not sure how to do better, however. -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/14030#comment:7 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler