Abandon ambiguity resolution on undefined name (#1907)

* Abandon ambiguity resolution on undefined name

This has finally annoyed me enough to do something about it. If we get a
"no such variable" error there's no point exploring other branches.

* Removes spaces from test file

One day I'll update the linter to ignore test files. We should really
accept literally anything as a possiblity for test files, even if
removing the spaces is tidier.

* Reset context before throwing in 'successful'

Although I don't think this is strictly necessary for a fatal error, we
should still for the sake of tidiness reset the state when backtracking.
This commit is contained in:
Edwin Brady 2021-09-07 00:41:08 +01:00 committed by GitHub
parent 9865765d1d
commit c861845757
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 78 additions and 0 deletions

View File

@ -580,8 +580,20 @@ successful allowCons ((tm, elab) :: elabs)
put EST est put EST est
put MD md put MD md
put Ctxt defs put Ctxt defs
when (abandon err) $ throw err
elabs' <- successful allowCons elabs elabs' <- successful allowCons elabs
pure (Left (tm, err) :: elabs')) pure (Left (tm, err) :: elabs'))
where
-- Some errors, it's not worth trying all the possibilities because
-- something serious has gone wrong, so just give up immediately.
abandon : Error -> Bool
abandon (UndefinedName _ _) = True
abandon (InType _ _ err) = abandon err
abandon (InCon _ _ err) = abandon err
abandon (InLHS _ _ err) = abandon err
abandon (InRHS _ _ err) = abandon err
abandon (AllFailed errs) = any (abandon . snd) errs
abandon _ = False
export export
exactlyOne' : {vars : _} -> exactlyOne' : {vars : _} ->

View File

@ -69,6 +69,7 @@ idrisTestsError = MkTestPool "Error messages" [] Nothing
"error006", "error007", "error008", "error009", "error010", "error006", "error007", "error008", "error009", "error010",
"error011", "error012", "error013", "error014", "error015", "error011", "error012", "error013", "error014", "error015",
"error016", "error017", "error018", "error019", "error020", "error016", "error017", "error018", "error019", "error020",
"error021",
-- Parse errors -- Parse errors
"perror001", "perror002", "perror003", "perror004", "perror005", "perror001", "perror002", "perror003", "perror004", "perror005",
"perror006", "perror007", "perror008", "perror009", "perror010", "perror006", "perror007", "perror008", "perror009", "perror010",

View File

@ -0,0 +1,50 @@
namespace A
export
x : Bool -> Bool
x = not
namespace B
export
x : Nat -> Bool
x Z = True
x _ = False
%ambiguity_depth 1000
-- There's an undefined name very deep here - if we don't take a shortcut,
-- this shows all the ambiguous branches with the undefined named!
test : Nat -> Bool
test val
= x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $
x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $
x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $
x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $
x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $
x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $
x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $
x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $
x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $
x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $
x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $
x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $
x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $
x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $
x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $
x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $
x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $
x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $
x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $
x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $
x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $
x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $
x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $
x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $
x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $
x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $
x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $
x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $
x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $
x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $
x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $
x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ va

View File

@ -0,0 +1,11 @@
1/1: Building DeepAmbig (DeepAmbig.idr)
Error: While processing right hand side of test. Undefined name va.
DeepAmbig:50:59--50:61
46 | x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $
47 | x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $
48 | x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $
49 | x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $
50 | x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ x $ va
^^

View File

@ -0,0 +1,4 @@
rm -rf build
$1 --no-color --console-width 0 --no-banner -Werror --check DeepAmbig.idr