From: Philip Herron Date: Thu, 20 Apr 2023 11:33:55 +0000 (+0100) Subject: gccrs: fix ICE with recursive function calls X-Git-Tag: basepoints/gcc-15~2617 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=91a86375d9869c8652734ce28dd30c2cdb21656e;p=thirdparty%2Fgcc.git gccrs: fix ICE with recursive function calls Fixes #2136 gcc/rust/ChangeLog: * backend/rust-compile-item.cc (CompileItem::visit): remove bad checks gcc/testsuite/ChangeLog: * rust/compile/issue-2136-1.rs: New test. * rust/compile/issue-2136-2.rs: New test. Signed-off-by: Philip Herron --- diff --git a/gcc/rust/backend/rust-compile-item.cc b/gcc/rust/backend/rust-compile-item.cc index 4b37b15f87eb..d953e4b13672 100644 --- a/gcc/rust/backend/rust-compile-item.cc +++ b/gcc/rust/backend/rust-compile-item.cc @@ -147,18 +147,8 @@ CompileItem::visit (HIR::Function &function) if (ctx->lookup_function_decl (fntype->get_ty_ref (), &lookup, fntype->get_id (), fntype, asm_name)) { - // has this been added to the list then it must be finished - if (ctx->function_completed (lookup)) - { - tree dummy = NULL_TREE; - if (!ctx->lookup_function_decl (fntype->get_ty_ref (), &dummy)) - { - ctx->insert_function_decl (fntype, lookup); - } - - reference = address_expression (lookup, ref_locus); - return; - } + reference = address_expression (lookup, ref_locus); + return; } if (fntype->has_subsititions_defined ()) diff --git a/gcc/testsuite/rust/compile/issue-2136-1.rs b/gcc/testsuite/rust/compile/issue-2136-1.rs new file mode 100644 index 000000000000..fcf1efcd171c --- /dev/null +++ b/gcc/testsuite/rust/compile/issue-2136-1.rs @@ -0,0 +1,14 @@ +pub trait Foo { + fn foo(); +} + +impl Foo for u16 { + fn foo() { + // { dg-warning "infinite recursion detected" "" { target *-*-* } .-1 } + ::foo() + } +} + +fn main() { + ::foo(); +} diff --git a/gcc/testsuite/rust/compile/issue-2136-2.rs b/gcc/testsuite/rust/compile/issue-2136-2.rs new file mode 100644 index 000000000000..7317f3f5151b --- /dev/null +++ b/gcc/testsuite/rust/compile/issue-2136-2.rs @@ -0,0 +1,13 @@ +struct S; + +impl S { + fn foo(self) { + // { dg-warning "infinite recursion detected" "" { target *-*-* } .-1 } + self.foo(); + } +} + +fn main() { + let a = S; + a.foo(); +}