From ae5bc52d9762500b95d9087b22b38105e9fda9e1 Mon Sep 17 00:00:00 2001 From: Sebastian Ullrich Date: Wed, 19 Jul 2017 16:03:08 +0200 Subject: [PATCH] fix(frontends/lean/elaborator): pass expected type through visit_function --- src/frontends/lean/elaborator.cpp | 18 +++++++++--------- src/frontends/lean/elaborator.h | 2 +- tests/lean/run/choice_anon_ctor.lean | 6 ++++++ 3 files changed, 16 insertions(+), 10 deletions(-) create mode 100644 tests/lean/run/choice_anon_ctor.lean diff --git a/src/frontends/lean/elaborator.cpp b/src/frontends/lean/elaborator.cpp index 7138872ca7..7543234196 100644 --- a/src/frontends/lean/elaborator.cpp +++ b/src/frontends/lean/elaborator.cpp @@ -926,7 +926,7 @@ void elaborator::save_identifier_info(expr const & f) { } } -expr elaborator::visit_function(expr const & fn, bool has_args, expr const & ref) { +expr elaborator::visit_function(expr const & fn, bool has_args, optional const & expected_type, expr const & ref) { if (is_placeholder(fn)) { throw elaborator_exception(ref, "placeholders '_' cannot be used where a function is expected"); } @@ -940,12 +940,12 @@ expr elaborator::visit_function(expr const & fn, bool has_args, expr const & ref case expr_kind::Sort: throw elaborator_exception(ref, "invalid application, function expected"); // The expr_kind::App case can only happen when nary notation is used - case expr_kind::App: r = visit(fn, none_expr()); break; + case expr_kind::App: r = visit(fn, expected_type); break; case expr_kind::Local: r = fn; break; case expr_kind::Constant: r = visit_const_core(fn); break; - case expr_kind::Macro: r = visit_macro(fn, none_expr(), true); break; - case expr_kind::Lambda: r = visit_lambda(fn, none_expr()); break; - case expr_kind::Let: r = visit_let(fn, none_expr()); break; + case expr_kind::Macro: r = visit_macro(fn, expected_type, true); break; + case expr_kind::Lambda: r = visit_lambda(fn, expected_type); break; + case expr_kind::Let: r = visit_let(fn, expected_type); break; } save_identifier_info(r); if (has_args) @@ -1670,7 +1670,7 @@ expr elaborator::visit_overloaded_app_core(buffer const & fns, buffer const & fns, bu // Restore state S.restore(*this); bool has_args = !args.empty(); - expr new_fn = visit_function(fn, has_args, ref); + expr new_fn = visit_function(fn, has_args, has_args ? none_expr() : some(expected_type), ref); first_pass_info info; first_pass(new_fn, args, expected_type, ref, info); candidates.emplace_back(new_fn, snapshot(*this), info); @@ -1914,7 +1914,7 @@ expr elaborator::visit_app_core(expr fn, buffer const & args, optional= args.size()) { @@ -1931,7 +1931,7 @@ expr elaborator::visit_app_core(expr fn, buffer const & args, optional const & expected_type, expr const & ref); format mk_app_type_mismatch_error(expr const & t, expr const & arg, expr const & arg_type, expr const & expected_type); format mk_app_arg_mismatch_error(expr const & t, expr const & arg, expr const & expected_arg); diff --git a/tests/lean/run/choice_anon_ctor.lean b/tests/lean/run/choice_anon_ctor.lean new file mode 100644 index 0000000000..b2f72866ad --- /dev/null +++ b/tests/lean/run/choice_anon_ctor.lean @@ -0,0 +1,6 @@ +import data.list data.vector + +structure author := +(name : string) + +def f : list author := [{name := "it's a me!"}]