diff options
author | Soham Chowdhury <chow.soham@gmail.com> | 2017-05-11 15:40:18 -0400 |
---|---|---|
committer | Ben Gamari <ben@smart-cactus.org> | 2017-05-11 17:26:18 -0400 |
commit | 1381c142cd8d030f9997cdc206dcad006c028bbb (patch) | |
tree | 2275933e04448f0fe06e6a2fa8a9c719537587b5 /compiler/rename/RnEnv.hs | |
parent | 6f999230e8f955ee61c470d34a02650165643f68 (diff) | |
download | haskell-1381c142cd8d030f9997cdc206dcad006c028bbb.tar.gz |
Fix incorrect ambiguity error on identically-named data constructors
Given multiple in-scope constructors with the same name, say `A`, and a
function of type `A -> Int`, say, the compiler reports both a "type `A`
is not in scope" and (incorrectly) an ambiguity error. The latter
shouldn't be there if `DataKinds` isn't enabled.
This issue was recommended to me by @mpickering as a suitable first
task, and the fix was also outlined in the original Trac ticket. It
involved a simple reordering of the steps taken in `lookup_demoted` in
`RnEnv.hs`. The fix is to make the `DataKinds` check happen earlier,
ensuring that the ambiguity check doesn't happen at all if we know the
constructors couldn't have been promoted.
Signed-off-by: Soham Chowdhury <chow.soham@gmail.com>
Reviewers: mpickering, austin, bgamari
Reviewed By: mpickering, bgamari
Subscribers: rwbarton, thomie
GHC Trac Issues: #13568
Differential Revision: https://phabricator.haskell.org/D3547
Diffstat (limited to 'compiler/rename/RnEnv.hs')
-rw-r--r-- | compiler/rename/RnEnv.hs | 21 |
1 files changed, 11 insertions, 10 deletions
diff --git a/compiler/rename/RnEnv.hs b/compiler/rename/RnEnv.hs index 570c6c0b91..12c8557b96 100644 --- a/compiler/rename/RnEnv.hs +++ b/compiler/rename/RnEnv.hs @@ -706,16 +706,17 @@ lookup_demoted rdr_name dflags | Just demoted_rdr <- demoteRdrName rdr_name -- Maybe it's the name of a *data* constructor = do { data_kinds <- xoptM LangExt.DataKinds - ; mb_demoted_name <- lookupOccRn_maybe demoted_rdr - ; case mb_demoted_name of - Nothing -> unboundNameX WL_Any rdr_name star_info - Just demoted_name - | data_kinds -> - do { whenWOptM Opt_WarnUntickedPromotedConstructors $ - addWarn (Reason Opt_WarnUntickedPromotedConstructors) - (untickedPromConstrWarn demoted_name) - ; return demoted_name } - | otherwise -> unboundNameX WL_Any rdr_name suggest_dk } + ; if data_kinds + then do { mb_demoted_name <- lookupOccRn_maybe demoted_rdr + ; case mb_demoted_name of + Nothing -> unboundNameX WL_Any rdr_name star_info + Just demoted_name -> + do { whenWOptM Opt_WarnUntickedPromotedConstructors $ + addWarn + (Reason Opt_WarnUntickedPromotedConstructors) + (untickedPromConstrWarn demoted_name) + ; return demoted_name } } + else unboundNameX WL_Any rdr_name suggest_dk } | otherwise = reportUnboundName rdr_name |