namespace Rust {
namespace TyTy {
+void
+emit_unexpected_argument_error (Location loc,
+ unsigned long unexpected_arg_count,
+ unsigned long expected_arg_count)
+{
+ // https://doc.rust-lang.org/error_codes/E0061.html
+ // rustc treats 1 as singular and others as plural
+ std::string err_msg = "this function takes %lu ";
+ if (expected_arg_count == 1)
+ {
+ err_msg += "argument";
+ }
+ else
+ {
+ err_msg += "arguments";
+ }
+
+ if (unexpected_arg_count == 1)
+ {
+ err_msg += " but %lu argument was supplied";
+ }
+ else
+ {
+ err_msg += " but %lu arguments were supplied";
+ }
+ rust_error_at (loc, ErrorCode ("E0061"), err_msg.c_str (), expected_arg_count,
+ unexpected_arg_count);
+}
+
void
TypeCheckCallExpr::visit (ADTType &type)
{
if (call.num_params () != variant.num_fields ())
{
- rust_error_at (call.get_locus (),
- "unexpected number of arguments %lu expected %lu",
- (unsigned long) call.num_params (),
- (unsigned long) variant.num_fields ());
+ emit_unexpected_argument_error (call.get_locus (),
+ (unsigned long) call.num_params (),
+ (unsigned long) variant.num_fields ());
return;
}
if (i != call.num_params ())
{
- rust_error_at (call.get_locus (),
- "unexpected number of arguments %lu expected %lu",
- (unsigned long) i, (unsigned long) call.num_params ());
+ emit_unexpected_argument_error (call.get_locus (), (unsigned long) i,
+ (unsigned long) call.num_params ());
return;
}
{
if (call.num_params () < type.num_params ())
{
- rust_error_at (call.get_locus (),
- "unexpected number of arguments %lu expected %lu",
- (unsigned long) call.num_params (),
- (unsigned long) type.num_params ());
+ emit_unexpected_argument_error (
+ call.get_locus (), (unsigned long) call.num_params (),
+ (unsigned long) type.num_params ());
return;
}
}
else
{
- rust_error_at (call.get_locus (),
- "unexpected number of arguments %lu expected %lu",
- (unsigned long) call.num_params (),
- (unsigned long) type.num_params ());
+ emit_unexpected_argument_error (call.get_locus (),
+ (unsigned long) call.num_params (),
+ (unsigned long) type.num_params ());
return;
}
}
if (i < call.num_params ())
{
- rust_error_at (call.get_locus (),
- "unexpected number of arguments %lu expected %lu",
- (unsigned long) i, (unsigned long) call.num_params ());
+ emit_unexpected_argument_error (call.get_locus (), (unsigned long) i,
+ (unsigned long) call.num_params ());
return;
}
{
if (call.num_params () != type.num_params ())
{
- rust_error_at (call.get_locus (),
- "unexpected number of arguments %lu expected %lu",
- (unsigned long) call.num_params (),
- (unsigned long) type.num_params ());
+ emit_unexpected_argument_error (call.get_locus (),
+ (unsigned long) call.num_params (),
+ (unsigned long) type.num_params ());
return;
}
if (i != call.num_params ())
{
- rust_error_at (call.get_locus (),
- "unexpected number of arguments %lu expected %lu",
- (unsigned long) i, (unsigned long) call.num_params ());
+ emit_unexpected_argument_error (call.get_locus (), (unsigned long) i,
+ (unsigned long) call.num_params ());
return;
}
size_t num_args_to_call = arguments.size () + 1;
if (num_args_to_call != type.num_params ())
{
- rust_error_at (call_locus,
- "unexpected number of arguments %lu expected %lu",
- (unsigned long) num_args_to_call,
- (unsigned long) type.num_params ());
+ emit_unexpected_argument_error (call_locus,
+ (unsigned long) num_args_to_call,
+ (unsigned long) type.num_params ());
return new ErrorType (type.get_ref ());
}
if (i != num_args_to_call)
{
- rust_error_at (call_locus,
- "unexpected number of arguments %lu expected %lu",
- (unsigned long) i, (unsigned long) arguments.size ());
+ emit_unexpected_argument_error (call_locus, (unsigned long) i,
+ (unsigned long) arguments.size ());
return new ErrorType (type.get_ref ());
}