diff --git a/intTests/test_type_errors/err020.log.good b/intTests/test_type_errors/err020.log.good index e11391bf4..3ccbceec3 100644 --- a/intTests/test_type_errors/err020.log.good +++ b/intTests/test_type_errors/err020.log.good @@ -1,5 +1,3 @@ Loading file "err020.saw" - err020.saw:3:20-3:33: Record lookup on non-record argument. -Field name: nonexistent - + err020.saw:3:20-3:33: Record lookup on non-record value of type Int FAILED diff --git a/intTests/test_type_errors/err021.log.good b/intTests/test_type_errors/err021.log.good index e69b74627..f327dad3c 100644 --- a/intTests/test_type_errors/err021.log.good +++ b/intTests/test_type_errors/err021.log.good @@ -1,5 +1,3 @@ Loading file "err021.saw" - err021.saw:8:18-8:31: Selecting a missing field. -Field name: nonexistent - + err021.saw:8:18-8:31: Record type has no field named nonexistent FAILED diff --git a/intTests/test_type_errors/err022.log.good b/intTests/test_type_errors/err022.log.good index 816b37509..8d6cf4af1 100644 --- a/intTests/test_type_errors/err022.log.good +++ b/intTests/test_type_errors/err022.log.good @@ -1,5 +1,3 @@ Loading file "err022.saw" - err022.saw:3:20-3:23: Tuple lookup on non-tuple argument. -Given index 3 - + err022.saw:3:20-3:23: Tuple lookup on non-tuple value of type Int FAILED diff --git a/intTests/test_type_errors/err023.log.good b/intTests/test_type_errors/err023.log.good index 3f479256d..fe07116a7 100644 --- a/intTests/test_type_errors/err023.log.good +++ b/intTests/test_type_errors/err023.log.good @@ -1,5 +1,3 @@ Loading file "err023.saw" - err023.saw:5:18-5:21: Tuple index out of bounds. -Given index 3 is too large for tuple size of 2 - + err023.saw:5:18-5:21: Tuple index 3 out of bounds; limit is 2 FAILED diff --git a/intTests/test_type_errors/err046.log.good b/intTests/test_type_errors/err046.log.good new file mode 100644 index 000000000..852584eac --- /dev/null +++ b/intTests/test_type_errors/err046.log.good @@ -0,0 +1,3 @@ + Loading file "err046.saw" + err046.saw:3:13-3:24: Cannot infer a record type for field someField; please use a type annotation +FAILED diff --git a/intTests/test_type_errors/err046.saw b/intTests/test_type_errors/err046.saw new file mode 100644 index 000000000..f54ec8721 --- /dev/null +++ b/intTests/test_type_errors/err046.saw @@ -0,0 +1,3 @@ +// Trigger the message about not supporting record inference. + +let foo x = x.someField; diff --git a/intTests/test_type_errors/err047.log.good b/intTests/test_type_errors/err047.log.good new file mode 100644 index 000000000..e4b63cb70 --- /dev/null +++ b/intTests/test_type_errors/err047.log.good @@ -0,0 +1,3 @@ + Loading file "err047.saw" + err047.saw:3:13-3:16: Cannot infer tuple arity for lookup of element 3; please use a type annotation +FAILED diff --git a/intTests/test_type_errors/err047.saw b/intTests/test_type_errors/err047.saw new file mode 100644 index 000000000..4b7c22e34 --- /dev/null +++ b/intTests/test_type_errors/err047.saw @@ -0,0 +1,3 @@ +// Trigger the message about not supporting tuple arity inference. + +let foo x = x.3; diff --git a/src/SAWScript/MGU.hs b/src/SAWScript/MGU.hs index 2d56e1c20..cc98ddcd9 100644 --- a/src/SAWScript/MGU.hs +++ b/src/SAWScript/MGU.hs @@ -1045,40 +1045,45 @@ inferExpr (ln, expr) = case expr of do (e1,t) <- inferExpr (ln, e) t1 <- applyCurrentSubst =<< resolveCurrentTypedefs t elTy <- case t1 of - TyRecord typos fs - | Just ty <- M.lookup n fs -> return ty - | otherwise -> - do recordError pos $ unlines - [ "Selecting a missing field." - , "Field name: " ++ Text.unpack n - ] - getErrorTyVar typos - _ -> do recordError pos $ unlines - [ "Record lookup on non-record argument." - , "Field name: " ++ Text.unpack n - ] - getErrorTyVar pos + TyRecord typos fs + | Just ty <- M.lookup n fs -> do + return ty + | otherwise -> do + recordError pos $ + "Record type has no field named " ++ Text.unpack n + getErrorTyVar typos + TyUnifyVar _ _ -> do + recordError pos $ + "Cannot infer a record type for field " ++ + Text.unpack n ++ "; please use a type annotation" + getErrorTyVar pos + _ -> do + recordError pos $ + "Record lookup on non-record value of type " ++ pShow t1 + getErrorTyVar pos return (Lookup pos e1 n, elTy) TLookup pos e i -> do (e1,t) <- inferExpr (ln,e) t1 <- applyCurrentSubst =<< resolveCurrentTypedefs t elTy <- case t1 of - TyCon typos (TupleCon n) tys - | i < n -> return (tys !! fromIntegral i) - | otherwise -> - do recordError pos $ unlines - [ "Tuple index out of bounds." - , "Given index " ++ show i ++ - " is too large for tuple size of " ++ - show n - ] - getErrorTyVar typos - _ -> do recordError pos $ unlines - [ "Tuple lookup on non-tuple argument." - , "Given index " ++ show i - ] - getErrorTyVar pos + TyCon typos (TupleCon n) tys + | i < n -> + return (tys !! fromIntegral i) + | otherwise -> do + recordError pos $ + "Tuple index " ++ show i ++ " out of bounds; limit is " ++ + show n + getErrorTyVar typos + TyUnifyVar _ _ -> do + recordError pos $ + "Cannot infer tuple arity for lookup of element " ++ + show i ++ "; please use a type annotation" + getErrorTyVar pos + _ -> do + recordError pos $ + "Tuple lookup on non-tuple value of type " ++ pShow t1 + getErrorTyVar pos return (TLookup pos e1 i, elTy) Var x ->