aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/rust/backend/rust-compile-struct-field-expr.h2
-rw-r--r--gcc/rust/backend/rust-compile.cc6
-rw-r--r--gcc/rust/hir/rust-ast-lower-struct-field-expr.h2
-rw-r--r--gcc/rust/hir/rust-ast-lower.cc16
-rw-r--r--gcc/rust/hir/tree/rust-hir-expr.h2
-rw-r--r--gcc/rust/resolve/rust-ast-resolve-struct-expr-field.h2
-rw-r--r--gcc/rust/resolve/rust-ast-resolve.cc6
-rw-r--r--gcc/rust/typecheck/rust-hir-type-check-struct-field.h2
-rw-r--r--gcc/rust/typecheck/rust-hir-type-check.cc25
-rw-r--r--gcc/testsuite/rust.test/compilable/struct_init_2.rs5
-rw-r--r--gcc/testsuite/rust.test/fail_compilation/struct_init1.rs8
11 files changed, 75 insertions, 1 deletions
diff --git a/gcc/rust/backend/rust-compile-struct-field-expr.h b/gcc/rust/backend/rust-compile-struct-field-expr.h
index a394f7a..0e54281 100644
--- a/gcc/rust/backend/rust-compile-struct-field-expr.h
+++ b/gcc/rust/backend/rust-compile-struct-field-expr.h
@@ -38,6 +38,8 @@ public:
void visit (HIR::StructExprFieldIdentifierValue &field);
+ void visit (HIR::StructExprFieldIndexValue &field);
+
private:
CompileStructExprField (Context *ctx)
: HIRCompileBase (ctx), translated (nullptr)
diff --git a/gcc/rust/backend/rust-compile.cc b/gcc/rust/backend/rust-compile.cc
index 6519a47..cb6272f 100644
--- a/gcc/rust/backend/rust-compile.cc
+++ b/gcc/rust/backend/rust-compile.cc
@@ -228,5 +228,11 @@ CompileStructExprField::visit (HIR::StructExprFieldIdentifierValue &field)
translated = CompileExpr::Compile (field.get_value (), ctx);
}
+void
+CompileStructExprField::visit (HIR::StructExprFieldIndexValue &field)
+{
+ translated = CompileExpr::Compile (field.get_value (), ctx);
+}
+
} // namespace Compile
} // namespace Rust
diff --git a/gcc/rust/hir/rust-ast-lower-struct-field-expr.h b/gcc/rust/hir/rust-ast-lower-struct-field-expr.h
index 1b444a5..71c1f1f 100644
--- a/gcc/rust/hir/rust-ast-lower-struct-field-expr.h
+++ b/gcc/rust/hir/rust-ast-lower-struct-field-expr.h
@@ -46,6 +46,8 @@ public:
void visit (AST::StructExprFieldIdentifierValue &field);
+ void visit (AST::StructExprFieldIndexValue &field);
+
private:
ASTLowerStructExprField () : translated (nullptr) {}
diff --git a/gcc/rust/hir/rust-ast-lower.cc b/gcc/rust/hir/rust-ast-lower.cc
index 55c6f72..d4c8224 100644
--- a/gcc/rust/hir/rust-ast-lower.cc
+++ b/gcc/rust/hir/rust-ast-lower.cc
@@ -212,5 +212,21 @@ ASTLowerStructExprField::visit (AST::StructExprFieldIdentifierValue &field)
field.get_locus ());
}
+void
+ASTLowerStructExprField::visit (AST::StructExprFieldIndexValue &field)
+{
+ HIR::Expr *value = ASTLoweringExpr::translate (field.get_value ().get ());
+
+ auto crate_num = mappings->get_current_crate ();
+ Analysis::NodeMapping mapping (crate_num, field.get_node_id (),
+ mappings->get_next_hir_id (crate_num),
+ UNKNOWN_LOCAL_DEFID);
+
+ translated
+ = new HIR::StructExprFieldIndexValue (mapping, field.get_index (),
+ std::unique_ptr<HIR::Expr> (value),
+ field.get_locus ());
+}
+
} // namespace HIR
} // namespace Rust
diff --git a/gcc/rust/hir/tree/rust-hir-expr.h b/gcc/rust/hir/tree/rust-hir-expr.h
index a81d523..a50f744 100644
--- a/gcc/rust/hir/tree/rust-hir-expr.h
+++ b/gcc/rust/hir/tree/rust-hir-expr.h
@@ -1591,6 +1591,8 @@ public:
void accept_vis (HIRVisitor &vis) override;
+ TupleIndex get_tuple_index () const { return index; };
+
protected:
/* Use covariance to implement clone function as returning this object rather
* than base */
diff --git a/gcc/rust/resolve/rust-ast-resolve-struct-expr-field.h b/gcc/rust/resolve/rust-ast-resolve-struct-expr-field.h
index c705a03..45d3e59 100644
--- a/gcc/rust/resolve/rust-ast-resolve-struct-expr-field.h
+++ b/gcc/rust/resolve/rust-ast-resolve-struct-expr-field.h
@@ -41,7 +41,7 @@ public:
void visit (AST::StructExprFieldIdentifierValue &field);
- // TODO
+ void visit (AST::StructExprFieldIndexValue &field);
private:
ResolveStructExprField (NodeId parent) : ResolverBase (parent) {}
diff --git a/gcc/rust/resolve/rust-ast-resolve.cc b/gcc/rust/resolve/rust-ast-resolve.cc
index e0b4f3a..910cd86 100644
--- a/gcc/rust/resolve/rust-ast-resolve.cc
+++ b/gcc/rust/resolve/rust-ast-resolve.cc
@@ -318,5 +318,11 @@ ResolveStructExprField::visit (AST::StructExprFieldIdentifierValue &field)
ResolveExpr::go (field.get_value ().get (), field.get_node_id ());
}
+void
+ResolveStructExprField::visit (AST::StructExprFieldIndexValue &field)
+{
+ ResolveExpr::go (field.get_value ().get (), field.get_node_id ());
+}
+
} // namespace Resolver
} // namespace Rust
diff --git a/gcc/rust/typecheck/rust-hir-type-check-struct-field.h b/gcc/rust/typecheck/rust-hir-type-check-struct-field.h
index 727569d..02bc9df 100644
--- a/gcc/rust/typecheck/rust-hir-type-check-struct-field.h
+++ b/gcc/rust/typecheck/rust-hir-type-check-struct-field.h
@@ -44,6 +44,8 @@ public:
void visit (HIR::StructExprFieldIdentifierValue &field);
+ void visit (HIR::StructExprFieldIndexValue &field);
+
private:
TypeCheckStructExpr ()
: TypeCheckBase (), resolved (nullptr), struct_path_resolved (nullptr)
diff --git a/gcc/rust/typecheck/rust-hir-type-check.cc b/gcc/rust/typecheck/rust-hir-type-check.cc
index a5b9b8b..6819627 100644
--- a/gcc/rust/typecheck/rust-hir-type-check.cc
+++ b/gcc/rust/typecheck/rust-hir-type-check.cc
@@ -197,5 +197,30 @@ TypeCheckStructExpr::visit (HIR::StructExprFieldIdentifierValue &field)
fields_assigned.insert (field.field_name);
}
+void
+TypeCheckStructExpr::visit (HIR::StructExprFieldIndexValue &field)
+{
+ std::string field_name (std::to_string (field.get_tuple_index ()));
+ auto it = fields_assigned.find (field_name);
+ if (it != fields_assigned.end ())
+ {
+ rust_fatal_error (field.get_locus (), "used more than once");
+ return;
+ }
+
+ TyTy::TyBase *value = TypeCheckExpr::Resolve (field.get_value ());
+ TyTy::StructFieldType *field_type
+ = struct_path_resolved->get_field (field_name);
+ if (field_type == nullptr)
+ {
+ rust_error_at (field.get_locus (), "unknown field");
+ return;
+ }
+
+ resolved_field = field_type->get_field_type ()->combine (value);
+ if (resolved_field != nullptr)
+ fields_assigned.insert (field_name);
+}
+
} // namespace Resolver
} // namespace Rust
diff --git a/gcc/testsuite/rust.test/compilable/struct_init_2.rs b/gcc/testsuite/rust.test/compilable/struct_init_2.rs
new file mode 100644
index 0000000..8d210b8
--- /dev/null
+++ b/gcc/testsuite/rust.test/compilable/struct_init_2.rs
@@ -0,0 +1,5 @@
+struct Foo(f32, f32);
+
+fn main() {
+ let a = Foo { 0: 10.0, 1: 20.0 };
+}
diff --git a/gcc/testsuite/rust.test/fail_compilation/struct_init1.rs b/gcc/testsuite/rust.test/fail_compilation/struct_init1.rs
new file mode 100644
index 0000000..3eadaef
--- /dev/null
+++ b/gcc/testsuite/rust.test/fail_compilation/struct_init1.rs
@@ -0,0 +1,8 @@
+struct Foo {
+ a: f32,
+ b: f32,
+}
+
+fn main() {
+ let a = Foo { 0: 10.0, 1: 20.0 };
+}