https://gcc.gnu.org/g:8592769349a33ff1fca3777021ad6ea8dab56c7d

commit 8592769349a33ff1fca3777021ad6ea8dab56c7d
Author: Owen Avery <powerboat9.ga...@gmail.com>
Date:   Wed Apr 30 16:20:53 2025 -0400

    Revert "backend: Remove checks on StructFieldIdentPattern"
    
    This reverts commit 92323dd3bb16f21194891ce463fc865598c6980f.

Diff:
---
 gcc/rust/backend/rust-compile-pattern.cc | 32 +++++++++++++++++++++++++-------
 1 file changed, 25 insertions(+), 7 deletions(-)

diff --git a/gcc/rust/backend/rust-compile-pattern.cc 
b/gcc/rust/backend/rust-compile-pattern.cc
index 671025ae8598..94844fed2e84 100644
--- a/gcc/rust/backend/rust-compile-pattern.cc
+++ b/gcc/rust/backend/rust-compile-pattern.cc
@@ -259,16 +259,34 @@ CompilePatternCheckExpr::visit (HIR::StructPattern 
&pattern)
          }
          break;
 
-       case HIR::StructPatternField::ItemType::IDENT_PAT:
-         // we only support rebinding patterns at the moment, which always
-         // match - so do nothing
+         case HIR::StructPatternField::ItemType::IDENT_PAT: {
+           HIR::StructPatternFieldIdentPat &ident
+             = static_cast<HIR::StructPatternFieldIdentPat &> (*field.get ());
+
+           size_t offs = 0;
+           ok = variant->lookup_field (ident.get_identifier ().as_string (),
+                                       nullptr, &offs);
+           rust_assert (ok);
 
-         // this needs to change once we actually check that the field
-         // matches a certain value, either a literal value or a const one
+           // we may be offsetting by + 1 here since the first field in the
+           // record is always the discriminator
+           offs += adt->is_enum ();
+           tree field_expr
+             = Backend::struct_field_expression (match_scrutinee_expr, offs,
+                                                 ident.get_locus ());
+
+           tree check_expr_sub
+             = CompilePatternCheckExpr::Compile (ident.get_pattern (),
+                                                 field_expr, ctx);
+           check_expr = Backend::arithmetic_or_logical_expression (
+             ArithmeticOrLogicalOperator::BITWISE_AND, check_expr,
+             check_expr_sub, ident.get_pattern ().get_locus ());
+         }
          break;
 
-       case HIR::StructPatternField::ItemType::IDENT:
-         // ident pattern always matches - do nothing
+         case HIR::StructPatternField::ItemType::IDENT: {
+           // ident pattern always matches - do nothing
+         }
          break;
        }
     }

Reply via email to