
#8337: make it possible for the user to force orphanness via a module-level annotation -------------------------------+------------------------------------------- Reporter: errge | Owner: Type: bug | Status: patch Priority: normal | Milestone: 7.8.1 Component: Compiler | Version: 7.6.3 Resolution: | Keywords: Operating System: | Architecture: Unknown/Multiple Unknown/Multiple | Difficulty: Easy (less than 1 hour) Type of failure: | Blocked By: None/Unknown | Related Tickets: Test Case: | Blocking: 7867 | -------------------------------+------------------------------------------- Comment (by errge): Yes, annotations are unfortunately local only. My usecase: - WGet.hs imports TCP.hs - TCP.hs defines a commandline flag (via a template haskell function called defineFlag) - called tcp_connect_timeout - this creates a module-level annotation in B.hs, containing all the info about the flag - Main.hs imports WGet.hs only (doesn't import TCP.hs) - Main.hs's main function contains a call to the initProgram splice - this gathers all the flags from all the imported modules transitively - generates a parser - generates a --help output - at runtime run's the parser or reports the usage - TCP and WGet can be in different package, so different compilation unit, not one ghc --make This assumes that Main.hs can reify annotations and module listings, but we're already working on that in #8397 and #8398. For this to work, TCP.hs needs to be orphan, otherwise it's not read by GHC when compiling Main.hs. Now your question: can we somehow figure this out automatically instead of depending on this hacky pragma? The only thing that gives us a clue is that there is a module annotation in TCP.hs. That's all. So I see the following options here: - I change the patch to make modules orphans if they contain module annotations, - I change the patch to have a new type of module annotation (I'm not sure about the syntax though, because e.g. `{-# ANN module orphan "String" #-}` is ambiguous between orphan module annotation of "String" or module annotation of (orphan "String")), - I make the current approach less confusing by explicit documentation and usecase description. In any case, I can of course add the documentation to the manual, I just wanted to get feedback as soon as possible, since we're a bit tight already for 7.8. Now that I gave this some thought, I don't really see why would someone want to reify annotations of values and types without importing them. On the other hand, I see the use case of "orphan" module annotations, so I prefer option 1. What is your opinion? -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/8337#comment:4 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler