Simon Jakobi pushed to branch wip/sjakobi/T2057 at Glasgow Haskell Compiler / GHC
Commits:
-
3180476f
by Simon Jakobi at 2026-03-09T01:02:03+01:00
-
13ab42f4
by Simon Jakobi at 2026-03-09T01:02:21+01:00
14 changed files:
- + testsuite/tests/driver/T2057/.gitignore
- testsuite/tests/driver/T2057/Makefile
- testsuite/tests/driver/T2057/T2057.stderr
- testsuite/tests/driver/T2057/all.T
- testsuite/tests/driver/T2057/src/app/Main.hs → testsuite/tests/driver/T2057/app/Main.hs
- − testsuite/tests/driver/T2057/basepkg-v1.conf.in
- − testsuite/tests/driver/T2057/basepkg-v2.conf.in
- − testsuite/tests/driver/T2057/dep.conf.in
- + testsuite/tests/driver/T2057/pkgA1.conf.in
- testsuite/tests/driver/T2057/src/base-v1/Base.hs → testsuite/tests/driver/T2057/pkgA1/A.hs
- + testsuite/tests/driver/T2057/pkgA2.conf.in
- testsuite/tests/driver/T2057/src/base-v2/Base.hs → testsuite/tests/driver/T2057/pkgA2/A.hs
- + testsuite/tests/driver/T2057/pkgB.conf.in
- testsuite/tests/driver/T2057/src/dep/Dep.hs → testsuite/tests/driver/T2057/pkgB/B.hs
Changes:
| 1 | +work/ |
| ... | ... | @@ -4,9 +4,9 @@ include $(TOP)/mk/test.mk |
| 4 | 4 | |
| 5 | 5 | WORK = work
|
| 6 | 6 | PKGDB = $(WORK)/pkgdb
|
| 7 | -BASE_V1 = $(WORK)/basepkg-v1
|
|
| 8 | -BASE_V2 = $(WORK)/basepkg-v2
|
|
| 9 | -DEP = $(WORK)/dep
|
|
| 7 | +PKGA1 = $(WORK)/pkgA1
|
|
| 8 | +PKGA2 = $(WORK)/pkgA2
|
|
| 9 | +PKGB = $(WORK)/pkgB
|
|
| 10 | 10 | APP = $(WORK)/app
|
| 11 | 11 | OUT = $(WORK)/T2057.out
|
| 12 | 12 | |
| ... | ... | @@ -15,29 +15,30 @@ OUT = $(WORK)/T2057.out |
| 15 | 15 | clean:
|
| 16 | 16 | rm -rf $(WORK)
|
| 17 | 17 | |
| 18 | +# Dependency graph:
|
|
| 19 | +# pkgB is built against pkgA1.
|
|
| 20 | +# We then rebuild the same installed unit id (pkgA1-1) from the pkgA2 sources,
|
|
| 21 | +# leaving pkgB with a stale unfolding that still references pkgA1's old API.
|
|
| 22 | +# Compiling Main against pkgB should therefore stop at the interface error.
|
|
| 18 | 23 | T2057: clean
|
| 19 | 24 | @set -eu; \
|
| 20 | 25 | BASE_ID=`'$(GHC_PKG)' field base id --simple-output`; \
|
| 21 | - mkdir -p '$(BASE_V1)' '$(BASE_V2)' '$(DEP)' '$(APP)'; \
|
|
| 26 | + mkdir -p '$(PKGA1)' '$(PKGA2)' '$(PKGB)' '$(APP)'; \
|
|
| 22 | 27 | '$(GHC_PKG)' init '$(PKGDB)'; \
|
| 23 | - cp src/base-v1/Base.hs '$(BASE_V1)/Base.hs'; \
|
|
| 24 | - cp src/base-v2/Base.hs '$(BASE_V2)/Base.hs'; \
|
|
| 25 | - cp src/dep/Dep.hs '$(DEP)/Dep.hs'; \
|
|
| 26 | - cp src/app/Main.hs '$(APP)/Main.hs'; \
|
|
| 27 | - '$(TEST_HC)' $(TEST_HC_OPTS) -v0 -package-db '$(PKGDB)' -this-unit-id basepkg-1 -O -c '$(BASE_V1)/Base.hs' -outputdir '$(BASE_V1)'; \
|
|
| 28 | - ar q '$(BASE_V1)/libHSbasepkg-1.a' '$(BASE_V1)/Base.o' >/dev/null 2>&1; \
|
|
| 29 | - sed "s|@BASE_ID@|$$BASE_ID|g" basepkg-v1.conf.in >'$(WORK)/basepkg-v1.conf'; \
|
|
| 30 | - '$(GHC_PKG)' --package-db '$(PKGDB)' register '$(WORK)/basepkg-v1.conf' >/dev/null; \
|
|
| 31 | - '$(TEST_HC)' $(TEST_HC_OPTS) -v0 -package-db '$(PKGDB)' -package basepkg -this-unit-id dep-1 -O -c '$(DEP)/Dep.hs' -outputdir '$(DEP)'; \
|
|
| 32 | - ar q '$(DEP)/libHSdep-1.a' '$(DEP)/Dep.o' >/dev/null 2>&1; \
|
|
| 33 | - sed "s|@BASE_ID@|$$BASE_ID|g" dep.conf.in >'$(WORK)/dep.conf'; \
|
|
| 34 | - '$(GHC_PKG)' --package-db '$(PKGDB)' register '$(WORK)/dep.conf' >/dev/null; \
|
|
| 35 | - '$(TEST_HC)' $(TEST_HC_OPTS) -v0 -package-db '$(PKGDB)' -this-unit-id basepkg-1 -O -c '$(BASE_V2)/Base.hs' -outputdir '$(BASE_V2)'; \
|
|
| 36 | - ar q '$(BASE_V2)/libHSbasepkg-1.a' '$(BASE_V2)/Base.o' >/dev/null 2>&1; \
|
|
| 37 | - sed "s|@BASE_ID@|$$BASE_ID|g" basepkg-v2.conf.in >'$(WORK)/basepkg-v2.conf'; \
|
|
| 38 | - '$(GHC_PKG)' --package-db '$(PKGDB)' update '$(WORK)/basepkg-v2.conf' >/dev/null; \
|
|
| 28 | + '$(TEST_HC)' $(TEST_HC_OPTS) -v0 -package-db '$(PKGDB)' -this-unit-id pkgA1-1 -O -c pkgA1/A.hs -outputdir '$(PKGA1)'; \
|
|
| 29 | + ar q '$(PKGA1)/libHSpkgA1-1.a' '$(PKGA1)/A.o' >/dev/null 2>&1; \
|
|
| 30 | + sed "s|@BASE_ID@|$$BASE_ID|g" pkgA1.conf.in >'$(WORK)/pkgA1.conf'; \
|
|
| 31 | + '$(GHC_PKG)' --package-db '$(PKGDB)' register '$(WORK)/pkgA1.conf' >/dev/null; \
|
|
| 32 | + '$(TEST_HC)' $(TEST_HC_OPTS) -v0 -package-db '$(PKGDB)' -package pkgA1 -this-unit-id pkgB-1 -O -c pkgB/B.hs -outputdir '$(PKGB)'; \
|
|
| 33 | + ar q '$(PKGB)/libHSpkgB-1.a' '$(PKGB)/B.o' >/dev/null 2>&1; \
|
|
| 34 | + sed "s|@BASE_ID@|$$BASE_ID|g" pkgB.conf.in >'$(WORK)/pkgB.conf'; \
|
|
| 35 | + '$(GHC_PKG)' --package-db '$(PKGDB)' register '$(WORK)/pkgB.conf' >/dev/null; \
|
|
| 36 | + '$(TEST_HC)' $(TEST_HC_OPTS) -v0 -package-db '$(PKGDB)' -this-unit-id pkgA1-1 -O -c pkgA2/A.hs -outputdir '$(PKGA2)'; \
|
|
| 37 | + ar q '$(PKGA2)/libHSpkgA1-1.a' '$(PKGA2)/A.o' >/dev/null 2>&1; \
|
|
| 38 | + sed "s|@BASE_ID@|$$BASE_ID|g" pkgA2.conf.in >'$(WORK)/pkgA2.conf'; \
|
|
| 39 | + '$(GHC_PKG)' --package-db '$(PKGDB)' update '$(WORK)/pkgA2.conf' >/dev/null; \
|
|
| 39 | 40 | status=0; \
|
| 40 | - '$(TEST_HC)' $(TEST_HC_OPTS) -v0 --make '$(APP)/Main.hs' -O -fforce-recomp -package-db '$(PKGDB)' -package dep >'$(OUT)' 2>&1 || status=$$?; \
|
|
| 41 | + '$(TEST_HC)' $(TEST_HC_OPTS) -v0 --make app/Main.hs -O -fforce-recomp -package-db '$(PKGDB)' -package pkgB >'$(OUT)' 2>&1 || status=$$?; \
|
|
| 41 | 42 | if [ $$status -eq 0 ]; then \
|
| 42 | 43 | echo "expected compilation failure" >&2; \
|
| 43 | 44 | exit 1; \
|
| 1 | -work/dep/Dep.hi
|
|
| 1 | +work/pkgB/B.hi
|
|
| 2 | 2 | Declaration for saved
|
| 3 | 3 | Unfolding of saved:
|
| 4 | 4 | staleDependencyBinding ErrorWithoutFlag
|
| 1 | 1 | test(
|
| 2 | 2 | 'T2057',
|
| 3 | - [ extra_files(['src', 'basepkg-v1.conf.in', 'basepkg-v2.conf.in', 'dep.conf.in'])
|
|
| 3 | + [ extra_files(['pkgA1', 'pkgA2', 'pkgB', 'app', 'pkgA1.conf.in', 'pkgA2.conf.in', 'pkgB.conf.in'])
|
|
| 4 | 4 | , when(opsys('mingw32'), skip)
|
| 5 | 5 | , js_skip
|
| 6 | 6 | , wasm_skip
|
| 1 | 1 | module Main where
|
| 2 | 2 | |
| 3 | -import Dep
|
|
| 3 | +import B
|
|
| 4 | 4 | |
| 5 | 5 | main :: IO ()
|
| 6 | 6 | main = print (saved 41) |
| 1 | -name: basepkg
|
|
| 2 | -version: 1.0
|
|
| 3 | -id: basepkg-1
|
|
| 4 | -key: basepkg-1
|
|
| 5 | -exposed: True
|
|
| 6 | -exposed-modules: Base
|
|
| 7 | -import-dirs: ${pkgroot}/basepkg-v1
|
|
| 8 | -library-dirs: ${pkgroot}/basepkg-v1
|
|
| 9 | -dynamic-library-dirs: ${pkgroot}/basepkg-v1
|
|
| 10 | -hs-libraries: HSbasepkg-1
|
|
| 11 | -depends: @BASE_ID@ |
| 1 | -name: basepkg
|
|
| 2 | -version: 1.0
|
|
| 3 | -id: basepkg-1
|
|
| 4 | -key: basepkg-1
|
|
| 5 | -exposed: True
|
|
| 6 | -exposed-modules: Base
|
|
| 7 | -import-dirs: ${pkgroot}/basepkg-v2
|
|
| 8 | -library-dirs: ${pkgroot}/basepkg-v2
|
|
| 9 | -dynamic-library-dirs: ${pkgroot}/basepkg-v2
|
|
| 10 | -hs-libraries: HSbasepkg-1
|
|
| 11 | -depends: @BASE_ID@ |
| 1 | -name: dep
|
|
| 2 | -version: 1.0
|
|
| 3 | -id: dep-1
|
|
| 4 | -key: dep-1
|
|
| 5 | -exposed: True
|
|
| 6 | -exposed-modules: Dep
|
|
| 7 | -import-dirs: ${pkgroot}/dep
|
|
| 8 | -library-dirs: ${pkgroot}/dep
|
|
| 9 | -dynamic-library-dirs: ${pkgroot}/dep
|
|
| 10 | -hs-libraries: HSdep-1
|
|
| 11 | -depends: basepkg-1 @BASE_ID@ |
| 1 | +name: pkgA1
|
|
| 2 | +version: 1.0
|
|
| 3 | +id: pkgA1-1
|
|
| 4 | +key: pkgA1-1
|
|
| 5 | +exposed: True
|
|
| 6 | +exposed-modules: A
|
|
| 7 | +import-dirs: ${pkgroot}/pkgA1
|
|
| 8 | +library-dirs: ${pkgroot}/pkgA1
|
|
| 9 | +dynamic-library-dirs: ${pkgroot}/pkgA1
|
|
| 10 | +hs-libraries: HSpkgA1-1
|
|
| 11 | +depends: @BASE_ID@ |
| 1 | -module Base (staleDependencyBinding) where
|
|
| 1 | +module A (staleDependencyBinding) where
|
|
| 2 | 2 | |
| 3 | 3 | {-# INLINE staleDependencyBinding #-}
|
| 4 | 4 | staleDependencyBinding :: Int -> Int
|
| 1 | +name: pkgA1
|
|
| 2 | +version: 1.0
|
|
| 3 | +id: pkgA1-1
|
|
| 4 | +key: pkgA1-1
|
|
| 5 | +exposed: True
|
|
| 6 | +exposed-modules: A
|
|
| 7 | +import-dirs: ${pkgroot}/pkgA2
|
|
| 8 | +library-dirs: ${pkgroot}/pkgA2
|
|
| 9 | +dynamic-library-dirs: ${pkgroot}/pkgA2
|
|
| 10 | +hs-libraries: HSpkgA1-1
|
|
| 11 | +depends: @BASE_ID@ |
| 1 | -module Base (replacementBinding) where
|
|
| 1 | +module A (replacementBinding) where
|
|
| 2 | 2 | |
| 3 | 3 | replacementBinding :: Int -> Int
|
| 4 | 4 | replacementBinding x = x + 100 |
| 1 | +name: pkgB
|
|
| 2 | +version: 1.0
|
|
| 3 | +id: pkgB-1
|
|
| 4 | +key: pkgB-1
|
|
| 5 | +exposed: True
|
|
| 6 | +exposed-modules: B
|
|
| 7 | +import-dirs: ${pkgroot}/pkgB
|
|
| 8 | +library-dirs: ${pkgroot}/pkgB
|
|
| 9 | +dynamic-library-dirs: ${pkgroot}/pkgB
|
|
| 10 | +hs-libraries: HSpkgB-1
|
|
| 11 | +depends: pkgA1-1 @BASE_ID@ |
| 1 | -module Dep (saved) where
|
|
| 1 | +module B (saved) where
|
|
| 2 | 2 | |
| 3 | -import Base
|
|
| 3 | +import A
|
|
| 4 | 4 | |
| 5 | 5 | {-# INLINE saved #-}
|
| 6 | 6 | saved :: Int -> Int
|