aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbors[bot] <26634292+bors[bot]@users.noreply.github.com>2021-11-25 15:01:01 +0000
committerGitHub <noreply@github.com>2021-11-25 15:01:01 +0000
commit295f0ae16613b44c13a15ae5ada080761b62ff54 (patch)
tree0b3be7ed250e3cd25605ee7ce656b385c1c0d6b5
parentbdfe6abe2b11e2ddad0b8c8a92b57297fdd73f6b (diff)
parente7e65bbdf3a06a7d00ed7da4ff8ebb16031ed6c3 (diff)
downloadgcc-295f0ae16613b44c13a15ae5ada080761b62ff54.zip
gcc-295f0ae16613b44c13a15ae5ada080761b62ff54.tar.gz
gcc-295f0ae16613b44c13a15ae5ada080761b62ff54.tar.bz2
Merge #817
817: Remove bad mutability check pass r=philberty a=philberty This was an initial pass to try and ensure all assignments were valid with respect to the binding mutability. This pass cannot be done at the name resolution level and in rustc is achieved on mir as part of the borrow checker. This patch removes this pass and associated test cases. This set of patches also adds support for indirection around array index expressions. Fixes #815 Co-authored-by: Philip Herron <philip.herron@embecosm.com>
-rw-r--r--gcc/rust/backend/rust-compile-expr.h26
-rw-r--r--gcc/rust/hir/rust-ast-lower-implitem.h6
-rw-r--r--gcc/rust/hir/rust-ast-lower-item.h2
-rw-r--r--gcc/rust/resolve/rust-ast-verify-assignee.h8
-rw-r--r--gcc/rust/typecheck/rust-hir-type-check-expr.h32
-rw-r--r--gcc/testsuite/rust/compile/array3.rs5
-rw-r--r--gcc/testsuite/rust/compile/immutable1.rs5
-rw-r--r--gcc/testsuite/rust/compile/immutable2.rs5
-rw-r--r--gcc/testsuite/rust/compile/immutable3.rs4
-rw-r--r--gcc/testsuite/rust/compile/immutable4.rs4
-rw-r--r--gcc/testsuite/rust/compile/immutable5.rs6
11 files changed, 51 insertions, 52 deletions
diff --git a/gcc/rust/backend/rust-compile-expr.h b/gcc/rust/backend/rust-compile-expr.h
index 2bf969b..46d501a 100644
--- a/gcc/rust/backend/rust-compile-expr.h
+++ b/gcc/rust/backend/rust-compile-expr.h
@@ -390,10 +390,32 @@ public:
void visit (HIR::ArrayIndexExpr &expr) override
{
- tree array = CompileExpr::Compile (expr.get_array_expr (), ctx);
+ tree array_reference = CompileExpr::Compile (expr.get_array_expr (), ctx);
tree index = CompileExpr::Compile (expr.get_index_expr (), ctx);
+
+ // lets check if the array is a reference type then we can add an
+ // indirection if required
+ TyTy::BaseType *array_expr_ty = nullptr;
+ bool ok = ctx->get_tyctx ()->lookup_type (
+ expr.get_array_expr ()->get_mappings ().get_hirid (), &array_expr_ty);
+ rust_assert (ok);
+
+ // do we need to add an indirect reference
+ if (array_expr_ty->get_kind () == TyTy::TypeKind::REF)
+ {
+ TyTy::ReferenceType *r
+ = static_cast<TyTy::ReferenceType *> (array_expr_ty);
+ TyTy::BaseType *tuple_type = r->get_base ();
+ tree array_tyty = TyTyResolveCompile::compile (ctx, tuple_type);
+
+ array_reference
+ = ctx->get_backend ()->indirect_expression (array_tyty,
+ array_reference, true,
+ expr.get_locus ());
+ }
+
translated
- = ctx->get_backend ()->array_index_expression (array, index,
+ = ctx->get_backend ()->array_index_expression (array_reference, index,
expr.get_locus ());
}
diff --git a/gcc/rust/hir/rust-ast-lower-implitem.h b/gcc/rust/hir/rust-ast-lower-implitem.h
index 8f9c5d5..3613df5 100644
--- a/gcc/rust/hir/rust-ast-lower-implitem.h
+++ b/gcc/rust/hir/rust-ast-lower-implitem.h
@@ -153,7 +153,7 @@ public:
= HIR::FunctionParam (mapping, std::move (translated_pattern),
std::move (translated_type),
param.get_locus ());
- function_params.push_back (hir_param);
+ function_params.push_back (std::move (hir_param));
}
bool terminated = false;
@@ -239,7 +239,7 @@ public:
= HIR::FunctionParam (mapping, std::move (translated_pattern),
std::move (translated_type),
param.get_locus ());
- function_params.push_back (hir_param);
+ function_params.push_back (std::move (hir_param));
}
bool terminated = false;
@@ -345,7 +345,7 @@ public:
= HIR::FunctionParam (mapping, std::move (translated_pattern),
std::move (translated_type),
param.get_locus ());
- function_params.push_back (hir_param);
+ function_params.push_back (std::move (hir_param));
}
HIR::TraitFunctionDecl decl (ref.get_identifier (), std::move (qualifiers),
diff --git a/gcc/rust/hir/rust-ast-lower-item.h b/gcc/rust/hir/rust-ast-lower-item.h
index 65a4921..697e98a 100644
--- a/gcc/rust/hir/rust-ast-lower-item.h
+++ b/gcc/rust/hir/rust-ast-lower-item.h
@@ -465,7 +465,7 @@ public:
= HIR::FunctionParam (mapping, std::move (translated_pattern),
std::move (translated_type),
param.get_locus ());
- function_params.push_back (hir_param);
+ function_params.push_back (std::move (hir_param));
}
bool terminated = false;
diff --git a/gcc/rust/resolve/rust-ast-verify-assignee.h b/gcc/rust/resolve/rust-ast-verify-assignee.h
index d362fe4..e9f6f23 100644
--- a/gcc/rust/resolve/rust-ast-verify-assignee.h
+++ b/gcc/rust/resolve/rust-ast-verify-assignee.h
@@ -65,14 +65,6 @@ public:
ok = true;
// mark the assignment to the name
resolver->mark_assignment_to_decl (resolved_node, parent);
-
- // check is mutable
- if (!resolver->decl_is_mutable (resolved_node))
- {
- // we only allow a single assignment to immutable decls
- if (resolver->get_num_assignments_to_decl (resolved_node) > 1)
- rust_error_at (expr.get_locus (), "cannot assign to immutable");
- }
}
void visit (AST::DereferenceExpr &expr) override
diff --git a/gcc/rust/typecheck/rust-hir-type-check-expr.h b/gcc/rust/typecheck/rust-hir-type-check-expr.h
index fb1cd97..8c34b6c 100644
--- a/gcc/rust/typecheck/rust-hir-type-check-expr.h
+++ b/gcc/rust/typecheck/rust-hir-type-check-expr.h
@@ -929,24 +929,27 @@ public:
auto resolved_index_expr
= size_ty->unify (TypeCheckExpr::Resolve (expr.get_index_expr (), false));
- if (resolved_index_expr == nullptr)
+ if (resolved_index_expr->get_kind () != TyTy::TypeKind::ERROR)
{
- rust_error_at (expr.get_index_expr ()->get_locus (),
- "Type Resolver failure in Index for ArrayIndexExpr");
- return;
+ // allow the index expr to fail lets just continue on
+ context->insert_type (expr.get_index_expr ()->get_mappings (),
+ resolved_index_expr);
}
- context->insert_type (expr.get_index_expr ()->get_mappings (),
- resolved_index_expr);
- // resolve the array reference
- expr.get_array_expr ()->accept_vis (*this);
- if (infered == nullptr)
+ auto array_expr_ty
+ = TypeCheckExpr::Resolve (expr.get_array_expr (), inside_loop);
+ if (array_expr_ty->get_kind () == TyTy::TypeKind::ERROR)
+ return;
+ else if (array_expr_ty->get_kind () == TyTy::TypeKind::REF)
{
- rust_error_at (expr.get_index_expr ()->get_locus (),
- "failed to resolve array reference expression");
- return;
+ // lets try and deref it since rust allows this
+ auto ref = static_cast<TyTy::ReferenceType *> (array_expr_ty);
+ auto base = ref->get_base ();
+ if (base->get_kind () == TyTy::TypeKind::ARRAY)
+ array_expr_ty = base;
}
- else if (infered->get_kind () != TyTy::TypeKind::ARRAY)
+
+ if (array_expr_ty->get_kind () != TyTy::TypeKind::ARRAY)
{
rust_error_at (expr.get_index_expr ()->get_locus (),
"expected an ArrayType got [%s]",
@@ -955,7 +958,8 @@ public:
return;
}
- TyTy::ArrayType *array_type = static_cast<TyTy::ArrayType *> (infered);
+ TyTy::ArrayType *array_type
+ = static_cast<TyTy::ArrayType *> (array_expr_ty);
infered = array_type->get_element_type ()->clone ();
}
diff --git a/gcc/testsuite/rust/compile/array3.rs b/gcc/testsuite/rust/compile/array3.rs
new file mode 100644
index 0000000..a62c6ca
--- /dev/null
+++ b/gcc/testsuite/rust/compile/array3.rs
@@ -0,0 +1,5 @@
+fn foo(state: &mut [u32; 16], a: usize) {
+ // { dg-warning "function is never used: .foo." "" { target *-*-* } .-1 }
+ // { dg-warning "unused name .foo." "" { target *-*-* } .-2 }
+ state[a] = 1;
+}
diff --git a/gcc/testsuite/rust/compile/immutable1.rs b/gcc/testsuite/rust/compile/immutable1.rs
deleted file mode 100644
index d78c1b7..0000000
--- a/gcc/testsuite/rust/compile/immutable1.rs
+++ /dev/null
@@ -1,5 +0,0 @@
-static x: i32 = 3;
-
-fn main() {
- x = 1; /* { dg-error "cannot assign to immutable" } */
-}
diff --git a/gcc/testsuite/rust/compile/immutable2.rs b/gcc/testsuite/rust/compile/immutable2.rs
deleted file mode 100644
index 86e70fe..0000000
--- a/gcc/testsuite/rust/compile/immutable2.rs
+++ /dev/null
@@ -1,5 +0,0 @@
-const TEST_CONST: i32 = 10;
-
-fn main() {
- TEST_CONST = 1; // { dg-error "cannot assign to immutable" }
-}
diff --git a/gcc/testsuite/rust/compile/immutable3.rs b/gcc/testsuite/rust/compile/immutable3.rs
deleted file mode 100644
index fb60280..0000000
--- a/gcc/testsuite/rust/compile/immutable3.rs
+++ /dev/null
@@ -1,4 +0,0 @@
-fn main() {
- let a = 1;
- a += 2; // { dg-error "cannot assign to immutable" }
-}
diff --git a/gcc/testsuite/rust/compile/immutable4.rs b/gcc/testsuite/rust/compile/immutable4.rs
deleted file mode 100644
index fb14554..0000000
--- a/gcc/testsuite/rust/compile/immutable4.rs
+++ /dev/null
@@ -1,4 +0,0 @@
-fn main() {
- let array: [i32; 3] = [0; 3];
- array[0] = 1; // { dg-error "cannot assign to immutable" }
-}
diff --git a/gcc/testsuite/rust/compile/immutable5.rs b/gcc/testsuite/rust/compile/immutable5.rs
deleted file mode 100644
index db23609..0000000
--- a/gcc/testsuite/rust/compile/immutable5.rs
+++ /dev/null
@@ -1,6 +0,0 @@
-struct Foo(f32, i32);
-
-fn main() {
- let a = Foo(1, 2);
- a.0 = 22; // { dg-error "cannot assign to immutable" }
-}