@@ -295,15 +295,14 @@ infer' m (ObjectLiteral ps) = do
295295 lift $ ensureNoDuplicateProperties ps
296296 ts <- mapM (infer m . snd) ps
297297 let fields = zipWith (\(name, _) t -> (name, t)) ps ts
298− return $ Object $ typesToRow fields
298+ return $ Object $ rowFromList (fields, REmpty)
299299infer' m (ObjectUpdate o ps) = do
300300 lift $ ensureNoDuplicateProperties ps
301− obj <- infer m o
302301 row <- fresh
303− ts <- mapM (infer m . snd) ps
304− let tys = zipWith (\(name, _) t -> (name, t)) ps ts
305− obj ~~ Object (rowFromList (tys, row))
306− return obj
302+ newTys <- zipWith (\(name, _) t -> (name, t)) ps <$> mapM (infer m . snd) ps
303+ oldTys <- zip (map fst ps) <$> replicateM (length ps) fresh
304+ check m o $ Object $ rowFromList (oldTys, row)
305+ return $ Object $ rowFromList (newTys, row)
307306infer' m (Indexer index val) = do
308307 el <- fresh
309308 check m index Number
@@ -662,9 +661,13 @@ check' m (IfThenElse cond th el) ty = do
662661check' m (ObjectLiteral ps) (Object row) = do
663662 lift $ ensureNoDuplicateProperties ps
664663 checkProperties m ps row False
665−check' m (ObjectUpdate obj ps) objTy@(Object row) = do
664+check' m (ObjectUpdate obj ps) (Object row) = do
666665 lift $ ensureNoDuplicateProperties ps
667− check m obj objTy
666+ us <- zip (map fst ps) <$> replicateM (length ps) fresh
667+ let (propsToCheck, rest) = rowToList row
668+ propsToRemove = map fst ps
669+ remainingProps = filter (\(p, _) -> p `notElem` propsToRemove) propsToCheck
670+ check m obj (Object (rowFromList (us ++ remainingProps, rest)))
668671 checkProperties m ps row True
669672check' m (Accessor prop val) ty = do
670673 rest <- fresh