diff options
Diffstat (limited to 'compiler/GHC/Rename')
-rw-r--r-- | compiler/GHC/Rename/Expr.hs | 25 | ||||
-rw-r--r-- | compiler/GHC/Rename/HsType.hs | 4 | ||||
-rw-r--r-- | compiler/GHC/Rename/Module.hs | 3 |
3 files changed, 27 insertions, 5 deletions
diff --git a/compiler/GHC/Rename/Expr.hs b/compiler/GHC/Rename/Expr.hs index 49af58bd1c..4ee8870318 100644 --- a/compiler/GHC/Rename/Expr.hs +++ b/compiler/GHC/Rename/Expr.hs @@ -248,8 +248,9 @@ finishHsVar (L l name) rnUnboundVar :: RdrName -> RnM (HsExpr GhcRn, FreeVars) rnUnboundVar v = do deferOutofScopeVariables <- goptM Opt_DeferOutOfScopeVariables + -- See Note [Reporting unbound names] for difference between qualified and unqualified names. unless (isUnqual v || deferOutofScopeVariables) (reportUnboundName v >> return ()) - return (HsUnboundVar noExtField (rdrNameOcc v), emptyFVs) + return (HsUnboundVar noExtField v, emptyFVs) rnExpr (HsVar _ (L l v)) = do { dflags <- getDynFlags @@ -751,6 +752,28 @@ bindNonRec will automatically do the right thing, giving us: case expr of y -> (\x -> op y x) See #18151. + +Note [Reporting unbound names] +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Faced with an out-of-scope `RdrName` there are two courses of action +A. Report an error immediately (and return a HsUnboundVar). This will halt GHC after the renamer is complete +B. Return a HsUnboundVar without reporting an error. That will allow the typechecker to run, which in turn + can give a better error message, notably giving the type of the variable via the "typed holes" mechanism. + +When `-fdefer-out-of-scope-variables` is on we follow plan B. + +When it is not, we follow plan B for unqualified names, and plan A for qualified names. + +If a name is qualified, and out of scope, then by default an error will be raised +because the user was already more precise. They specified a specific qualification +and either + * The qualification didn't exist, so that precision was wrong. + * Or the qualification existed and the thing we were looking for wasn't where + the qualification said it would be. + +However we can still defer this error completely, and we do defer it if +`-fdefer-out-of-scope-variables` is enabled. + -} {- diff --git a/compiler/GHC/Rename/HsType.hs b/compiler/GHC/Rename/HsType.hs index bca65c7cad..aaaa249ba2 100644 --- a/compiler/GHC/Rename/HsType.hs +++ b/compiler/GHC/Rename/HsType.hs @@ -1425,7 +1425,7 @@ data NegationHandling = ReassociateNegation | KeepNegationIntact -- | Name of an operator in an operator application or section data OpName = NormalOp Name -- ^ A normal identifier | NegateOp -- ^ Prefix negation - | UnboundOp OccName -- ^ An unbound identifier + | UnboundOp RdrName -- ^ An unbound identifier | RecFldOp (FieldOcc GhcRn) -- ^ A record field occurrence instance Outputable OpName where @@ -1607,7 +1607,7 @@ checkSectionPrec direction section op arg lookupFixityOp :: OpName -> RnM Fixity lookupFixityOp (NormalOp n) = lookupFixityRn n lookupFixityOp NegateOp = lookupFixityRn negateName -lookupFixityOp (UnboundOp u) = lookupFixityRn (mkUnboundName u) +lookupFixityOp (UnboundOp u) = lookupFixityRn (mkUnboundName (occName u)) lookupFixityOp (RecFldOp f) = lookupFieldFixityRn f diff --git a/compiler/GHC/Rename/Module.hs b/compiler/GHC/Rename/Module.hs index 537e161e42..97726a279c 100644 --- a/compiler/GHC/Rename/Module.hs +++ b/compiler/GHC/Rename/Module.hs @@ -1370,8 +1370,7 @@ badRuleLhsErr name lhs bad_e err = case bad_e of HsUnboundVar _ uv -> - let rdr = mkRdrUnqual uv - in pprScopeError rdr $ notInScopeErr WL_Global (mkRdrUnqual uv) + pprScopeError uv $ notInScopeErr WL_Global uv _ -> text "Illegal expression:" <+> ppr bad_e {- ************************************************************** |