[GHC] #16385: Lousy error message for `instance forall c. c`

#16385: Lousy error message for `instance forall c. c` -------------------------------------+------------------------------------- Reporter: RyanGlScott | Owner: (none) Type: bug | Status: new Priority: normal | Milestone: Component: Compiler | Version: 8.6.3 Keywords: | Operating System: Unknown/Multiple Architecture: | Type of failure: Poor/confusing Unknown/Multiple | error message Test Case: | Blocked By: Blocking: | Related Tickets: Differential Rev(s): | Wiki Page: -------------------------------------+------------------------------------- This erroneous program is rejected with a rather strange error message: {{{#!hs {-# LANGUAGE ScopedTypeVariables #-} module Bug where instance forall c. c }}} {{{ $ /opt/ghc/8.6.3/bin/ghc Bug.hs [1 of 1] Compiling Bug ( Bug.hs, Bug.o ) Bug.hs:4:20: error: Not in scope: type variable ācā | 4 | instance forall c. c | ^ }}} This error message is hogwash, since `c` is absolutely in scope. The reason GHC believes that `c` is out of scope is because before GHC renamed the type signature in the instance, it performs a pass over all top-level binders in `RnNames.getLocalNonValBinders` to obtain their `Name`s. In particular, [https://gitlab.haskell.org/ghc/ghc/blob/473632d7671619ee08a2a0025aa22bd4f79e... this] is the culprit: {{{#!hs new_assoc overload_ok (L _ (ClsInstD _ (ClsInstDecl { cid_poly_ty = inst_ty , cid_datafam_insts = adts }))) | Just (L loc cls_rdr) <- getLHsInstDeclClass_maybe inst_ty = do { cls_nm <- setSrcSpan loc $ lookupGlobalOccRn cls_rdr ; (avails, fldss) <- mapAndUnzipM (new_loc_di overload_ok (Just cls_nm)) adts ; return (avails, concat fldss) } | otherwise = return ([], []) -- Do not crash on ill-formed instances -- Eg instance !Show Int Trac #3811c }}} Notice the use of `lookupGlobalOccRn` there. Since this code just tunnels into the instance type signature (using `getLHsInstDeclClass_maybe`) without binding any type variables, this calls `lookupGlobalOcc` on an unbound type variable `c`. Eek. I believe the fix would be to use `lookupGlobalOccRn_maybe` instead and simply default to `return ([], [])` in the event that `lookupGlobalOccRn_maybe` returns Nothing. -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/16385 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler

#16385: Lousy error message for `instance forall c. c` -------------------------------------+------------------------------------- Reporter: RyanGlScott | Owner: (none) Type: bug | Status: patch Priority: normal | Milestone: Component: Compiler | Version: 8.6.3 Resolution: | Keywords: Operating System: Unknown/Multiple | Architecture: Type of failure: Poor/confusing | Unknown/Multiple error message | Test Case: Blocked By: | Blocking: Related Tickets: | Differential Rev(s): Wiki Page: | https://gitlab.haskell.org/ghc/ghc/merge_requests/483 -------------------------------------+------------------------------------- Changes (by RyanGlScott): * status: new => patch * differential: => https://gitlab.haskell.org/ghc/ghc/merge_requests/483 -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/16385#comment:1 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler

#16385: Lousy error message for `instance forall c. c` -------------------------------------+------------------------------------- Reporter: RyanGlScott | Owner: (none) Type: bug | Status: closed Priority: normal | Milestone: 8.10.1 Component: Compiler | Version: 8.6.3 Resolution: fixed | Keywords: Operating System: Unknown/Multiple | Architecture: | Unknown/Multiple Type of failure: Poor/confusing | Test Case: error message | rename/should_fail/T16385 Blocked By: | Blocking: Related Tickets: | Differential Rev(s): Wiki Page: | https://gitlab.haskell.org/ghc/ghc/merge_requests/483 -------------------------------------+------------------------------------- Changes (by RyanGlScott): * status: patch => closed * testcase: => rename/should_fail/T16385 * resolution: => fixed * milestone: => 8.10.1 Comment: Fixed in [https://gitlab.haskell.org/ghc/ghc/commit/78dd04f9126dc5df966070b8db4b39a517... 78dd04f9]. -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/16385#comment:2 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler

#16385: Lousy error message for `instance forall c. c`
-------------------------------------+-------------------------------------
Reporter: RyanGlScott | Owner: (none)
Type: bug | Status: closed
Priority: normal | Milestone: 8.10.1
Component: Compiler | Version: 8.6.3
Resolution: fixed | Keywords:
Operating System: Unknown/Multiple | Architecture:
| Unknown/Multiple
Type of failure: Poor/confusing | Test Case:
error message | rename/should_fail/T16385
Blocked By: | Blocking:
Related Tickets: | Differential Rev(s):
Wiki Page: | https://gitlab.haskell.org/ghc/ghc/merge_requests/483
-------------------------------------+-------------------------------------
Comment (by Marge Bot
participants (1)
-
GHC