From eb2c6124c46d0b3d58630c80af007ed092adc1ea Mon Sep 17 00:00:00 2001 From: Philip Herron Date: Thu, 29 Apr 2021 13:16:26 +0100 Subject: Improve error messages of unexpected arguments When we get GenericBindings such as :: this is not allowed int this context. We can also improve the unexpected number of argument errors to print the number of expected vs received arguments. --- gcc/rust/typecheck/rust-tyty.cc | 24 ++++++++++++++++++---- .../rust.test/xfail_compile/expected_type_args2.rs | 2 +- .../rust.test/xfail_compile/expected_type_args3.rs | 2 +- gcc/testsuite/rust.test/xfail_compile/generics4.rs | 2 +- 4 files changed, 23 insertions(+), 7 deletions(-) (limited to 'gcc') diff --git a/gcc/rust/typecheck/rust-tyty.cc b/gcc/rust/typecheck/rust-tyty.cc index b75c139..c8f5f19 100644 --- a/gcc/rust/typecheck/rust-tyty.cc +++ b/gcc/rust/typecheck/rust-tyty.cc @@ -211,16 +211,32 @@ SubstitutionParamMapping::override_context () SubstitutionArgumentMappings SubstitutionRef::get_mappings_from_generic_args (HIR::GenericArgs &args) { - if (args.get_type_args ().size () != substitutions.size ()) + if (args.get_binding_args ().size () > 0) { rust_error_at (args.get_locus (), - "Invalid number of generic arguments to generic type"); + "associated type bindings are not allowed here"); return SubstitutionArgumentMappings::error (); } - std::vector mappings; + if (args.get_type_args ().size () > substitutions.size ()) + { + rust_error_at ( + args.get_locus (), + "generic item takes at most %lu type arguments but %lu were supplied", + substitutions.size (), args.get_type_args ().size ()); + return SubstitutionArgumentMappings::error (); + } - // FIXME does not support binding yet + if (args.get_type_args ().size () < substitutions.size ()) + { + rust_error_at ( + args.get_locus (), + "generic item takes at least %lu type arguments but %lu were supplied", + substitutions.size (), args.get_type_args ().size ()); + return SubstitutionArgumentMappings::error (); + } + + std::vector mappings; for (auto &arg : args.get_type_args ()) { BaseType *resolved = Resolver::TypeCheckType::Resolve (arg.get ()); diff --git a/gcc/testsuite/rust.test/xfail_compile/expected_type_args2.rs b/gcc/testsuite/rust.test/xfail_compile/expected_type_args2.rs index b92c48f..4b1f704 100644 --- a/gcc/testsuite/rust.test/xfail_compile/expected_type_args2.rs +++ b/gcc/testsuite/rust.test/xfail_compile/expected_type_args2.rs @@ -2,5 +2,5 @@ struct Foo(A); fn main() { let a: Foo = Foo::(123); - // { dg-error "Invalid number of generic arguments to generic type" "" { target { *-*-* } } .-1 } + // { dg-error "generic item takes at least 1 type arguments but 0 were supplied" "" { target { *-*-* } } .-1 } } diff --git a/gcc/testsuite/rust.test/xfail_compile/expected_type_args3.rs b/gcc/testsuite/rust.test/xfail_compile/expected_type_args3.rs index 4c164ff..dc70f76 100644 --- a/gcc/testsuite/rust.test/xfail_compile/expected_type_args3.rs +++ b/gcc/testsuite/rust.test/xfail_compile/expected_type_args3.rs @@ -1,7 +1,7 @@ struct Foo(A); impl Foo { - // { dg-error "Invalid number of generic arguments to generic type" "" { target { *-*-* } } .-1 } + // { dg-error "generic item takes at least 1 type arguments but 0 were supplied" "" { target { *-*-* } } .-1 } fn test() -> i32 { 123 } diff --git a/gcc/testsuite/rust.test/xfail_compile/generics4.rs b/gcc/testsuite/rust.test/xfail_compile/generics4.rs index 0c18540..a831836 100644 --- a/gcc/testsuite/rust.test/xfail_compile/generics4.rs +++ b/gcc/testsuite/rust.test/xfail_compile/generics4.rs @@ -3,7 +3,7 @@ struct GenericStruct(T, usize); fn main() { let a2; - a2 = GenericStruct::(1, 456); // { dg-error "Invalid number of generic arguments to generic type" } + a2 = GenericStruct::(1, 456); // { dg-error "generic item takes at most 1 type arguments but 2 were supplied" } let b2: i32 = a2.0; let c2: usize = a2.1; -- cgit v1.1