aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/rust/backend/rust-compile-item.h13
-rw-r--r--gcc/rust/backend/rust-compile.cc7
-rw-r--r--gcc/testsuite/rust.test/compilable/forward_decl_2.rs5
-rw-r--r--gcc/testsuite/rust.test/compilable/forward_decl_3.rs8
-rw-r--r--gcc/testsuite/rust.test/compilable/forward_decl_4.rs8
5 files changed, 36 insertions, 5 deletions
diff --git a/gcc/rust/backend/rust-compile-item.h b/gcc/rust/backend/rust-compile-item.h
index 8c7eda5..a367ac7 100644
--- a/gcc/rust/backend/rust-compile-item.h
+++ b/gcc/rust/backend/rust-compile-item.h
@@ -31,9 +31,9 @@ namespace Compile {
class CompileItem : public HIRCompileBase
{
public:
- static void compile (HIR::Item *item, Context *ctx)
+ static void compile (HIR::Item *item, Context *ctx, bool compile_fns = true)
{
- CompileItem compiler (ctx);
+ CompileItem compiler (ctx, compile_fns);
item->accept_vis (compiler);
}
@@ -116,6 +116,9 @@ public:
void visit (HIR::Function &function)
{
+ if (!compile_fns)
+ return;
+
// items can be forward compiled which means we may not need to invoke this
// code
Bfunction *lookup = nullptr;
@@ -277,7 +280,11 @@ public:
}
private:
- CompileItem (Context *ctx) : HIRCompileBase (ctx) {}
+ CompileItem (Context *ctx, bool compile_fns)
+ : HIRCompileBase (ctx), compile_fns (compile_fns)
+ {}
+
+ bool compile_fns;
};
} // namespace Compile
diff --git a/gcc/rust/backend/rust-compile.cc b/gcc/rust/backend/rust-compile.cc
index b394289..772d975 100644
--- a/gcc/rust/backend/rust-compile.cc
+++ b/gcc/rust/backend/rust-compile.cc
@@ -41,8 +41,11 @@ CompileCrate::Compile (HIR::Crate &crate, Context *ctx)
void
CompileCrate::go ()
{
- for (auto it = crate.items.begin (); it != crate.items.end (); it++)
- CompileItem::compile (it->get (), ctx);
+ for (auto &item : crate.items)
+ CompileItem::compile (item.get (), ctx, false);
+
+ for (auto &item : crate.items)
+ CompileItem::compile (item.get (), ctx, true);
}
// rust-compile-block.h
diff --git a/gcc/testsuite/rust.test/compilable/forward_decl_2.rs b/gcc/testsuite/rust.test/compilable/forward_decl_2.rs
new file mode 100644
index 0000000..ba9c963
--- /dev/null
+++ b/gcc/testsuite/rust.test/compilable/forward_decl_2.rs
@@ -0,0 +1,5 @@
+fn main() {
+ let y = x + 1;
+}
+
+static x: i32 = 3;
diff --git a/gcc/testsuite/rust.test/compilable/forward_decl_3.rs b/gcc/testsuite/rust.test/compilable/forward_decl_3.rs
new file mode 100644
index 0000000..257b0f7
--- /dev/null
+++ b/gcc/testsuite/rust.test/compilable/forward_decl_3.rs
@@ -0,0 +1,8 @@
+fn main() {
+ let struct_test = Foo { one: 1, two: 2 };
+}
+
+struct Foo {
+ one: i32,
+ two: i32,
+}
diff --git a/gcc/testsuite/rust.test/compilable/forward_decl_4.rs b/gcc/testsuite/rust.test/compilable/forward_decl_4.rs
new file mode 100644
index 0000000..dd8a725
--- /dev/null
+++ b/gcc/testsuite/rust.test/compilable/forward_decl_4.rs
@@ -0,0 +1,8 @@
+fn main() {
+ let mut x = TEST_CONST;
+ x = x + 1;
+
+ let mut y = x + TEST_CONST;
+}
+
+const TEST_CONST: i32 = 10;