Skip to content

Commit

Permalink
gccrs: Fix ICE accessing empty vector without check
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
philberty committed Feb 3, 2024
1 parent 74c85f3 commit d6c97f6
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 1 deletion.
3 changes: 2 additions & 1 deletion gcc/rust/typecheck/rust-tyty-subst.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
31 changes: 31 additions & 0 deletions gcc/testsuite/rust/compile/issue-2747.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
#[lang = "sized"]
pub trait Sized {}

#[lang = "fn_once"]
pub trait FnOnce<Args> {
#[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],
};
}

0 comments on commit d6c97f6

Please sign in to comment.