aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPhilip Herron <philip.herron@embecosm.com>2021-04-29 13:16:26 +0100
committerPhilip Herron <philip.herron@embecosm.com>2021-04-29 14:19:36 +0100
commiteb2c6124c46d0b3d58630c80af007ed092adc1ea (patch)
tree2abecea3993a36362857f6e450a4781232a5dfca
parentf189f5bbab73b5d04faee4f4d2198f023c9e1522 (diff)
downloadgcc-eb2c6124c46d0b3d58630c80af007ed092adc1ea.zip
gcc-eb2c6124c46d0b3d58630c80af007ed092adc1ea.tar.gz
gcc-eb2c6124c46d0b3d58630c80af007ed092adc1ea.tar.bz2
Improve error messages of unexpected arguments
When we get GenericBindings such as ::<A=...> 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.
-rw-r--r--gcc/rust/typecheck/rust-tyty.cc24
-rw-r--r--gcc/testsuite/rust.test/xfail_compile/expected_type_args2.rs2
-rw-r--r--gcc/testsuite/rust.test/xfail_compile/expected_type_args3.rs2
-rw-r--r--gcc/testsuite/rust.test/xfail_compile/generics4.rs2
4 files changed, 23 insertions, 7 deletions
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<SubstitutionArg> 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<SubstitutionArg> 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>(A);
fn main() {
let a: Foo = Foo::<i32>(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>(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>(T, usize);
fn main() {
let a2;
- a2 = GenericStruct::<i8, i32>(1, 456); // { dg-error "Invalid number of generic arguments to generic type" }
+ a2 = GenericStruct::<i8, i32>(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;