From d6c97f6d03845b018f855bc310493269f0b50eb5 Mon Sep 17 00:00:00 2001 From: Philip Herron Date: Sat, 3 Feb 2024 16:32:13 +0000 Subject: [PATCH] gccrs: Fix ICE accessing empty vector without check Fixes #2747 gcc/rust/ChangeLog: * typecheck/rust-tyty-subst.cc (SubstitutionRef::get_mappings_from_generic_args): fix gcc/testsuite/ChangeLog: * rust/compile/issue-2747.rs: New test. --- gcc/rust/typecheck/rust-tyty-subst.cc | 3 ++- gcc/testsuite/rust/compile/issue-2747.rs | 31 ++++++++++++++++++++++++ 2 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/rust/compile/issue-2747.rs diff --git a/gcc/rust/typecheck/rust-tyty-subst.cc b/gcc/rust/typecheck/rust-tyty-subst.cc index 287d1fb6ab9b..f2afbba35e3e 100644 --- a/gcc/rust/typecheck/rust-tyty-subst.cc +++ b/gcc/rust/typecheck/rust-tyty-subst.cc @@ -660,7 +660,8 @@ SubstitutionRef::get_mappings_from_generic_args ( if (args.get_type_args ().size () + offs > substitutions.size ()) { rich_location r (line_table, args.get_locus ()); - r.add_range (substitutions.front ().get_param_locus ()); + if (!substitutions.empty ()) + r.add_range (substitutions.front ().get_param_locus ()); rust_error_at ( r, diff --git a/gcc/testsuite/rust/compile/issue-2747.rs b/gcc/testsuite/rust/compile/issue-2747.rs new file mode 100644 index 000000000000..a9c09e7372f4 --- /dev/null +++ b/gcc/testsuite/rust/compile/issue-2747.rs @@ -0,0 +1,31 @@ +#[lang = "sized"] +pub trait Sized {} + +#[lang = "fn_once"] +pub trait FnOnce { + #[lang = "fn_once_output"] + type Output; + + extern "rust-call" fn call_once(self, args: Args) -> Self::Output; +} + +struct Foo<'a, 'b: 'a> { + x: &'a i32, + y: &'a i32, + a: &'b i32, + q: &'a [&'b i32], +} + +pub fn test<'x, 'y>(f: Foo<'x, 'y, ()>) { + // { dg-error "generic item takes at most 0 type arguments but 1 were supplied" "" { target *-*-* } .-1 } + let x = 5; + let y = 6; + let z = 7; + type F<'a, 'b> = fn(&'a i32, &'b i32) -> i32; + let f = Foo { + x: &x, + y: &y, + a: &z, + q: &[&x, &y], + }; +}