-unitAvailEnv :: RdrNameIE -> AvailInfo -> AvailEnv
-unitAvailEnv ie NotAvailable = emptyFM
-unitAvailEnv ie (AvailTC _ []) = emptyFM
-unitAvailEnv ie avail = unitFM (nameOccName (availName avail)) (ie,avail)
-
-plusAvailEnv a1 a2
- = mapRn (addErrRn.availClashErr) (conflictsFM bad_avail a1 a2) `thenRn_`
- returnRn (plusFM_C plus_avail a1 a2)
-
-listToAvailEnv :: RdrNameIE -> [AvailInfo] -> RnM s d AvailEnv
-listToAvailEnv ie items
- = foldlRn plusAvailEnv emptyAvailEnv (map (unitAvailEnv ie) items)
-
-bad_avail (ie1,avail1) (ie2,avail2) = availName avail1 /= availName avail2 -- Same OccName, different Name
-plus_avail (ie1,a1) (ie2,a2) = (ie1, a1 `plusAvail` a2)
+{-
+ Add new entry to environment. Checks for name clashes, i.e.,
+ plain duplicates or exported entity pairs that have different OccNames.
+ (c.f. 5.1.1 of Haskell 1.4 report.)
+-}
+addAvailEnv :: Bool -> RdrNameIE -> AvailEnv -> AvailInfo -> RnM s d AvailEnv
+addAvailEnv warn_dups ie env NotAvailable = returnRn env
+addAvailEnv warn_dups ie env (AvailTC _ []) = returnRn env
+addAvailEnv warn_dups ie env avail
+ | warn_dups = mapMaybeRn (addErrRn . availClashErr) () conflict `thenRn_`
+ returnRn (addToFM_C addAvail env key elt)
+ | otherwise = returnRn (addToFM_C addAvail env key elt)
+ where
+ occ_avail = nameOccName (availName avail)
+ occ_ie = ieOcc ie
+ key
+ | not warn_dups || occ_ie == occ_avail = occ_avail
+ | otherwise = occ_ie
+ -- export item is a class method, use export occ name instead.
+ -- (this is only needed to get more precise warnings about
+ -- duplicates.)
+ elt = (ie,avail,reports_on)
+
+ reports_on
+ | maybeToBool dup = 1
+ | otherwise = 0
+
+ conflict = conflictFM bad_avail env key elt
+ dup
+ | warn_dups = conflictFM dup_avail env key elt
+ | otherwise = Nothing
+
+addListToAvailEnv :: AvailEnv -> RdrNameIE -> [AvailInfo] -> RnM s d AvailEnv
+addListToAvailEnv env ie items
+ = foldlRn (addAvailEnv False{-don't warn about dups-} ie) env items
+
+bad_avail (ie1,avail1,r1) (ie2,avail2,r2)
+ = availName avail1 /= availName avail2 -- Same OccName, different Name
+dup_avail (ie1,avail1,r1) (ie2,avail2,r2)
+ = availName avail1 == availName avail2 -- Same OccName & avail.
+
+addAvail (ie1,a1,r1) (ie2,a2,r2) = (ie1, a1 `plusAvail` a2, r1 + r2)