]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
gccrs: ast: Handle tuplestruct pattern with indices
authorJakub Dupak <dev@jakubdupak.com>
Tue, 17 Oct 2023 13:39:06 +0000 (15:39 +0200)
committerArthur Cohen <arthur.cohen@embecosm.com>
Tue, 16 Jan 2024 18:09:23 +0000 (19:09 +0100)
gcc/rust/ChangeLog:

* hir/rust-ast-lower-pattern.cc (ASTLoweringPattern::visit): Implement for tuple pat.
* resolve/rust-ast-resolve-pattern.cc (PatternDeclaration::visit): Implement for tupple pat.

gcc/testsuite/ChangeLog:

* rust/compile/tupple_struct_pattern_tuple.rs: New test.

Signed-off-by: Jakub Dupak <dev@jakubdupak.com>
gcc/rust/hir/rust-ast-lower-pattern.cc
gcc/rust/resolve/rust-ast-resolve-pattern.cc
gcc/testsuite/rust/compile/tupple_struct_pattern_tuple.rs [new file with mode: 0644]

index bfb7b71cef21b656c73480d87b8b8ff01bbb9b0a..4693e7da04b1f263d9e0dcec6955a57f37afb240 100644 (file)
@@ -122,8 +122,23 @@ ASTLoweringPattern::visit (AST::StructPattern &pattern)
       switch (field->get_item_type ())
        {
          case AST::StructPatternField::ItemType::TUPLE_PAT: {
-           // TODO
-           rust_unreachable ();
+           AST::StructPatternFieldTuplePat &tuple
+             = static_cast<AST::StructPatternFieldTuplePat &> (*field);
+
+           auto crate_num = mappings->get_current_crate ();
+           Analysis::NodeMapping mapping (crate_num, tuple.get_node_id (),
+                                          mappings->get_next_hir_id (
+                                            crate_num),
+                                          UNKNOWN_LOCAL_DEFID);
+
+           std::unique_ptr<HIR::Pattern> pat (ASTLoweringPattern::translate (
+             tuple.get_index_pattern ().get ()));
+
+           f = new HIR::StructPatternFieldTuplePat (mapping,
+                                                    tuple.get_index (),
+                                                    std::move (pat),
+                                                    tuple.get_outer_attrs (),
+                                                    tuple.get_locus ());
          }
          break;
 
index 934300532d8f9cd158841b709c29263e85497e3e..545fcf82d44a8f56b302de0563dbc961fc91ec72 100644 (file)
@@ -124,8 +124,10 @@ PatternDeclaration::visit (AST::StructPattern &pattern)
       switch (field->get_item_type ())
        {
          case AST::StructPatternField::ItemType::TUPLE_PAT: {
-           // TODO
-           rust_unreachable ();
+           AST::StructPatternFieldTuplePat &tuple
+             = static_cast<AST::StructPatternFieldTuplePat &> (*field);
+
+           tuple.get_index_pattern ()->accept_vis (*this);
          }
          break;
 
@@ -151,9 +153,6 @@ PatternDeclaration::visit (AST::StructPattern &pattern)
          break;
        }
     }
-
-  // TODO
-  rust_assert (!struct_pattern_elems.has_etc ());
 }
 
 void
diff --git a/gcc/testsuite/rust/compile/tupple_struct_pattern_tuple.rs b/gcc/testsuite/rust/compile/tupple_struct_pattern_tuple.rs
new file mode 100644 (file)
index 0000000..053b9ce
--- /dev/null
@@ -0,0 +1,4 @@
+// { dg-additional-options "-frust-compile-until=typecheck" }
+struct Struct(i32);
+
+fn struct_pattern(Struct { 0: a }: Struct) {}