summaryrefslogtreecommitdiff
path: root/compiler/GHC/HsToCore
diff options
context:
space:
mode:
Diffstat (limited to 'compiler/GHC/HsToCore')
-rw-r--r--compiler/GHC/HsToCore/Monad.hs12
-rw-r--r--compiler/GHC/HsToCore/PmCheck/Oracle.hs12
-rw-r--r--compiler/GHC/HsToCore/Types.hs3
3 files changed, 17 insertions, 10 deletions
diff --git a/compiler/GHC/HsToCore/Monad.hs b/compiler/GHC/HsToCore/Monad.hs
index 0c9717d4eb..cffce7c3be 100644
--- a/compiler/GHC/HsToCore/Monad.hs
+++ b/compiler/GHC/HsToCore/Monad.hs
@@ -27,9 +27,9 @@ module GHC.HsToCore.Monad (
mkPrintUnqualifiedDs,
newUnique,
UniqSupply, newUniqueSupply,
- getGhcModeDs, dsGetFamInstEnvs,
+ getGhcModeDs, dsGetFamInstEnvs, dsGetGlobalRdrEnv,
dsLookupGlobal, dsLookupGlobalId, dsLookupTyCon,
- dsLookupDataCon, dsLookupConLike,
+ dsLookupDataCon,
getCCIndexDsM,
DsMetaEnv, DsMetaVal(..), dsGetMetaEnv, dsLookupMetaEnv, dsExtendMetaEnv,
@@ -72,7 +72,6 @@ import GHC.Driver.Types
import GHC.Data.Bag
import GHC.Types.Basic ( Origin )
import GHC.Core.DataCon
-import GHC.Core.ConLike
import GHC.Core.TyCon
import GHC.HsToCore.Types
import GHC.HsToCore.PmCheck.Types
@@ -302,6 +301,7 @@ mkDsEnvs dflags mod rdr_env type_env fam_inst_env msg_var cc_st_var
(unitState dflags)
(mkHomeUnitFromFlags dflags)
rdr_env
+ , ds_rdr_env = rdr_env
, ds_msgs = msg_var
, ds_complete_matches = complete_matches
, ds_cc_st = cc_st_var
@@ -522,10 +522,8 @@ dsLookupDataCon :: Name -> DsM DataCon
dsLookupDataCon name
= tyThingDataCon <$> dsLookupGlobal name
-dsLookupConLike :: Name -> DsM ConLike
-dsLookupConLike name
- = tyThingConLike <$> dsLookupGlobal name
-
+dsGetGlobalRdrEnv :: DsM GlobalRdrEnv
+dsGetGlobalRdrEnv = ds_rdr_env <$> getGblEnv
dsGetFamInstEnvs :: DsM FamInstEnvs
-- Gets both the external-package inst-env
diff --git a/compiler/GHC/HsToCore/PmCheck/Oracle.hs b/compiler/GHC/HsToCore/PmCheck/Oracle.hs
index fd76bcf70d..ee845c34be 100644
--- a/compiler/GHC/HsToCore/PmCheck/Oracle.hs
+++ b/compiler/GHC/HsToCore/PmCheck/Oracle.hs
@@ -44,6 +44,7 @@ import GHC.Types.Unique.DSet
import GHC.Types.Unique.DFM
import GHC.Types.Id
import GHC.Types.Name
+import GHC.Types.Name.Reader (GlobalRdrEnv, lookupGRE_Name)
import GHC.Types.Var (EvVar)
import GHC.Types.Var.Env
import GHC.Types.Var.Set
@@ -1737,11 +1738,16 @@ generateInhabitingPatterns (x:xs) n nabla = do
pickApplicableCompleteSets :: Type -> ResidualCompleteMatches -> DsM [ConLikeSet]
pickApplicableCompleteSets ty rcm = do
+ gre <- dsGetGlobalRdrEnv
env <- dsGetFamInstEnvs
- pure $ filter (all (is_valid env) . uniqDSetToList) (getRcm rcm)
+ pure $ filter (all (is_valid gre env) . uniqDSetToList) (getRcm rcm)
where
- is_valid :: FamInstEnvs -> ConLike -> Bool
- is_valid env cl = isJust (guessConLikeUnivTyArgsFromResTy env ty cl)
+ is_valid :: GlobalRdrEnv -> FamInstEnvs -> ConLike -> Bool
+ is_valid gre env cl = isJust (guessConLikeUnivTyArgsFromResTy env ty cl)
+ && isJust (lookupGRE_Name gre (conLikeName cl))
+ -- filter out ConLikes that the User can't write,
+ -- because they aren't imported or not even
+ -- exported. This is #13964.
{- Note [Why inhabitationTest doesn't call generateInhabitingPatterns]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
diff --git a/compiler/GHC/HsToCore/Types.hs b/compiler/GHC/HsToCore/Types.hs
index d6fd94e723..a3b84a99e8 100644
--- a/compiler/GHC/HsToCore/Types.hs
+++ b/compiler/GHC/HsToCore/Types.hs
@@ -10,6 +10,7 @@ import Data.IORef
import GHC.Types.CostCentre.State
import GHC.Types.Name.Env
+import GHC.Types.Name.Reader
import GHC.Types.SrcLoc
import GHC.Types.Var
import GHC.Hs (LForeignDecl, HsExpr, GhcTc)
@@ -46,6 +47,8 @@ data DsGblEnv
, ds_msgs :: IORef Messages -- Warning messages
, ds_if_env :: (IfGblEnv, IfLclEnv) -- Used for looking up global,
-- possibly-imported things
+ , ds_rdr_env :: GlobalRdrEnv -- ^ Used for looking up whether a
+ -- Name is imported or not
, ds_complete_matches :: CompleteMatches
-- Additional complete pattern matches
, ds_cc_st :: IORef CostCentreState