diff options
author | Philip Herron <herron.philip@googlemail.com> | 2023-04-20 12:33:55 +0100 |
---|---|---|
committer | Philip Herron <philip.herron@embecosm.com> | 2023-04-26 15:12:22 +0000 |
commit | 727056301b2124649daacc29a23bb4b357a25173 (patch) | |
tree | 48a9517b32f98a4240a66c689e15385848a43041 | |
parent | 8f6680458524877c7803eb9821ccf5e83ecfd080 (diff) | |
download | gcc-727056301b2124649daacc29a23bb4b357a25173.tar.gz |
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 <herron.philip@googlemail.com>
-rw-r--r-- | gcc/rust/backend/rust-compile-item.cc | 14 | ||||
-rw-r--r-- | gcc/testsuite/rust/compile/issue-2136-1.rs | 14 | ||||
-rw-r--r-- | gcc/testsuite/rust/compile/issue-2136-2.rs | 13 |
3 files changed, 29 insertions, 12 deletions
diff --git a/gcc/rust/backend/rust-compile-item.cc b/gcc/rust/backend/rust-compile-item.cc index e1e2bb6d5a0..c57acdf9872 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 00000000000..fcf1efcd171 --- /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 } + <u16 as Foo>::foo() + } +} + +fn main() { + <u16>::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 00000000000..7317f3f5151 --- /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(); +} |