- (_, dup_fields) = removeDups compare [ unLoc f | (f,_) <- rpats ]
-
- field_dup_err dups = addErr (dupFieldErr "pattern" dups)
-
- rn_rpat (field, pat)
- = lookupLocatedGlobalOccRn field `thenM` \ fieldname ->
- rnLPat pat `thenM` \ (pat', fvs) ->
- returnM ((fieldname, pat'), fvs `addOneFV` unLoc fieldname)
-
+ (_, dup_fields) = removeDups compare (map (unLoc . hsRecFieldId) fields)
+
+ field_dup_err dups = addErr (dupFieldErr str (head dups))
+
+ rn_rpat pun_ok (HsRecField field pat pun)
+ = do { fieldname <- lookupRecordBndr mb_con field
+ ; checkErr (not pun || pun_ok) (badPun field)
+ ; (pat', fvs) <- rn_thing pat
+ ; return (HsRecField fieldname pat' pun,
+ fvs `addOneFV` unLoc fieldname) }
+
+ dot_dot_fields fs Nothing = do { addErr (badDotDot str)
+ ; return ([], emptyFVs) }
+
+ -- Compute the extra fields to be filled in by the dot-dot notation
+ dot_dot_fields fs (Just con)
+ = do { con_fields <- lookupConstructorFields (unLoc con)
+ ; let missing_fields = con_fields `minusList` fs
+ ; loc <- getSrcSpanM -- Rather approximate
+ ; (rhss, fvs_s) <- mapAndUnzipM rn_thing
+ [ L loc (mk_rhs (mkRdrUnqual (getOccName f)))
+ | f <- missing_fields ]
+ ; let new_fs = [ HsRecField (L loc f) r False
+ | (f, r) <- missing_fields `zip` rhss ]
+ ; return (new_fs, plusFVs fvs_s) }
+
+needFlagDotDot str = vcat [ptext SLIT("Illegal `..' in record") <+> text str,
+ ptext SLIT("Use -frecord-dot-dot to permit this")]
+
+badDotDot str = ptext SLIT("You cannot use `..' in record") <+> text str
+
+badPun fld = vcat [ptext SLIT("Illegal use of punning for field") <+> quotes (ppr fld),
+ ptext SLIT("Use -frecord-puns to permit this")]