Vladislav Zavialov pushed to branch wip/int-index/rta-patsyn-lookup at Glasgow Haskell Compiler / GHC
Commits:
-
bc17078d
by Vladislav Zavialov at 2026-08-13T18:09:10+03:00
9 changed files:
- + changelog.d/T27586
- compiler/GHC/Tc/TyCl/PatSyn.hs
- + testsuite/tests/vdq-rta/should_fail/T27586a.hs
- + testsuite/tests/vdq-rta/should_fail/T27586a.stderr
- + testsuite/tests/vdq-rta/should_fail/T27586b.hs
- + testsuite/tests/vdq-rta/should_fail/T27586b.stderr
- + testsuite/tests/vdq-rta/should_fail/T27586c.hs
- + testsuite/tests/vdq-rta/should_fail/T27586c.stderr
- testsuite/tests/vdq-rta/should_fail/all.T
Changes:
| 1 | +section: compiler
|
|
| 2 | +issues: #27586
|
|
| 3 | +mrs: !16440
|
|
| 4 | +synopsis:
|
|
| 5 | + Fix a panic on a required type argument in a pattern synonym RHS
|
|
| 6 | +description:
|
|
| 7 | + An argument of a pattern synonym that is matched against a required type
|
|
| 8 | + argument in the right-hand side no longer causes a panic; it is reported as
|
|
| 9 | + an illegal term-level use of a type variable. |
| ... | ... | @@ -137,7 +137,7 @@ tcInferPatSynDecl (PSB { psb_id = lname@(L _ name), psb_args = details |
| 137 | 137 | ; (tclvl, wanted, ((lpat', args), pat_ty))
|
| 138 | 138 | <- pushLevelAndCaptureConstraints $
|
| 139 | 139 | tcInferPat FRRPatSynArg PatSynCtx lpat $
|
| 140 | - mapM tcLookupId arg_names
|
|
| 140 | + mapM tcLookupPatSynArg arg_names
|
|
| 141 | 141 | |
| 142 | 142 | ; let (ex_tvs, prov_dicts) = tcCollectEx lpat'
|
| 143 | 143 | |
| ... | ... | @@ -472,7 +472,7 @@ tcCheckPatSynDecl psb@PSB{ psb_id = lname@(L _ name), psb_args = details |
| 472 | 472 | -- location to x's binding site in lpat, namely the 'x' in Just (x,True).
|
| 473 | 473 | -- Else the error message location is wherever tcCheckPat finished,
|
| 474 | 474 | -- namely the right-hand corner of the pattern
|
| 475 | - do { arg_id <- tcLookupId arg_name
|
|
| 475 | + do { arg_id <- tcLookupPatSynArg arg_name
|
|
| 476 | 476 | ; wrap <- tcSubTypeSigma (OccurrenceOf (idName arg_id))
|
| 477 | 477 | GenSigCtxt
|
| 478 | 478 | (idType arg_id)
|
| ... | ... | @@ -645,6 +645,19 @@ collectPatSynArgInfo details = |
| 645 | 645 | InfixCon _ name1 name2 -> (map unLoc [name1, name2], True)
|
| 646 | 646 | RecCon _ names -> (map (unLoc . recordPatSynPatVar) names, False)
|
| 647 | 647 | |
| 648 | +-- | Look up the 'Id' bound by the pattern for a declared argument of a pattern
|
|
| 649 | +-- synonym. With @RequiredTypeArguments@ the argument may turn out to be a type
|
|
| 650 | +-- variable, e.g. @pattern P x = MkT x@ where the argument of @MkT@ is a required
|
|
| 651 | +-- type argument; then we report an illegal term-level use of @x@ (#27586).
|
|
| 652 | +tcLookupPatSynArg :: Name -> TcM Id
|
|
| 653 | +tcLookupPatSynArg arg_name
|
|
| 654 | + = do { thing <- tcLookup arg_name
|
|
| 655 | + ; case thing of
|
|
| 656 | + ATcId { tct_id = id } -> return id
|
|
| 657 | + AGlobal (AnId id) -> return id
|
|
| 658 | + ATyVar {} -> failIllegalTyVar (noUserRdr arg_name)
|
|
| 659 | + _ -> pprPanic "tcLookupPatSynArg" (ppr arg_name) }
|
|
| 660 | + |
|
| 648 | 661 | wrongNumberOfParmsErr :: Name -> Arity -> Arity -> TcM a
|
| 649 | 662 | wrongNumberOfParmsErr name decl_arity missing
|
| 650 | 663 | = failWithTc $ TcRnPatSynArityMismatch name decl_arity missing
|
| 1 | +{-# LANGUAGE GADTs, RequiredTypeArguments, PatternSynonyms #-}
|
|
| 2 | + |
|
| 3 | +module T27586a where
|
|
| 4 | + |
|
| 5 | +data T a where
|
|
| 6 | + MkT :: forall a -> T a
|
|
| 7 | + |
|
| 8 | +pattern P :: Int -> T Int
|
|
| 9 | +pattern P x = MkT x |
| 1 | +T27586a.hs:9:19: error: [GHC-01928]
|
|
| 2 | + • Illegal term-level use of the type variable ‘x’
|
|
| 3 | + • bound at T27586a.hs:9:19
|
|
| 4 | + • In the declaration for pattern synonym ‘P’
|
|
| 5 | + |
| 1 | +{-# LANGUAGE GADTs, RequiredTypeArguments, PatternSynonyms #-}
|
|
| 2 | + |
|
| 3 | +module T27586b where
|
|
| 4 | + |
|
| 5 | +data T a where
|
|
| 6 | + MkT :: forall a -> T a
|
|
| 7 | + |
|
| 8 | +pattern P x = MkT x |
| 1 | +T27586b.hs:8:15: error: [GHC-01928]
|
|
| 2 | + • Illegal term-level use of the type variable ‘x’
|
|
| 3 | + • bound at T27586b.hs:8:19
|
|
| 4 | + • In the declaration for pattern synonym ‘P’
|
|
| 5 | + |
| 1 | +{-# LANGUAGE GADTs, RequiredTypeArguments, PatternSynonyms #-}
|
|
| 2 | + |
|
| 3 | +module T27586c where
|
|
| 4 | + |
|
| 5 | +data T a where
|
|
| 6 | + MkT :: forall a -> T a
|
|
| 7 | + |
|
| 8 | +pattern P :: Int -> T Int
|
|
| 9 | +pattern P x <- MkT x |
| 1 | +T27586c.hs:9:20: error: [GHC-01928]
|
|
| 2 | + • Illegal term-level use of the type variable ‘x’
|
|
| 3 | + • bound at T27586c.hs:9:20
|
|
| 4 | + • In the declaration for pattern synonym ‘P’
|
|
| 5 | + |
| ... | ... | @@ -32,3 +32,6 @@ test('T24159_type_syntax_tc_fail', normal, compile_fail, ['']) |
| 32 | 32 | test('T24159_type_syntax_th_fail', normal, ghci_script, ['T24159_type_syntax_th_fail.script'])
|
| 33 | 33 | test('T25127_fail_th_quote', normal, compile_fail, [''])
|
| 34 | 34 | test('T25127_fail_arity', normal, compile_fail, [''])
|
| 35 | +test('T27586a', normal, compile_fail, [''])
|
|
| 36 | +test('T27586b', normal, compile_fail, [''])
|
|
| 37 | +test('T27586c', normal, compile_fail, ['']) |