[gcc r14-8007] gccrs: Fix typechecking (and compilation) error for alt patterns in match expressions.
Arthur Cohen
cohenarthur@gcc.gnu.org
Tue Jan 16 18:12:59 GMT 2024
https://gcc.gnu.org/g:15648d5b8dc5a8cab1b11e14e5e5c178e32ed366
commit r14-8007-g15648d5b8dc5a8cab1b11e14e5e5c178e32ed366
Author: Dave Evans <dave@dmetwo.org>
Date: Thu Aug 24 14:10:42 2023 -0500
gccrs: Fix typechecking (and compilation) error for alt patterns in match expressions.
gcc/rust/ChangeLog:
* backend/rust-compile-pattern.cc (CompilePatternCaseLabelExpr::visit):
Add AltPattern visitor function
* backend/rust-compile-pattern.h:
Update CompilePatternCaseLabelExpr::visit(AltPattern&).
* typecheck/rust-hir-type-check-pattern.cc (TypeCheckPattern::visit):
Update AltPattern visitor
gcc/testsuite/ChangeLog:
* rust/compile/issue-2431.rs: New test.
Signed-off-by: Dave Evans <dave@dmetwo.org>
Diff:
---
gcc/rust/backend/rust-compile-pattern.cc | 11 +++++++++++
gcc/rust/backend/rust-compile-pattern.h | 16 ++-------------
gcc/rust/typecheck/rust-hir-type-check-pattern.cc | 24 +++++++++++++++++++++--
gcc/testsuite/rust/compile/issue-2431.rs | 6 ++++++
4 files changed, 41 insertions(+), 16 deletions(-)
diff --git a/gcc/rust/backend/rust-compile-pattern.cc b/gcc/rust/backend/rust-compile-pattern.cc
index 38fcedb011d..66726d20d42 100644
--- a/gcc/rust/backend/rust-compile-pattern.cc
+++ b/gcc/rust/backend/rust-compile-pattern.cc
@@ -104,6 +104,17 @@ CompilePatternCaseLabelExpr::visit (HIR::LiteralPattern &pattern)
case_label_expr = build_case_label (lit, NULL_TREE, associated_case_label);
}
+void
+CompilePatternCaseLabelExpr::visit (HIR::AltPattern &pattern)
+{
+ const auto &alts = pattern.get_alts ();
+ for (auto &alt_pattern : alts)
+ {
+ CompilePatternCaseLabelExpr::Compile (alt_pattern.get (),
+ associated_case_label, ctx);
+ }
+}
+
static tree
compile_range_pattern_bound (HIR::RangePatternBound *bound,
Analysis::NodeMapping mappings, location_t locus,
diff --git a/gcc/rust/backend/rust-compile-pattern.h b/gcc/rust/backend/rust-compile-pattern.h
index e8e4e5d2edd..23c0d1b8e74 100644
--- a/gcc/rust/backend/rust-compile-pattern.h
+++ b/gcc/rust/backend/rust-compile-pattern.h
@@ -39,13 +39,7 @@ public:
void visit (HIR::TupleStructPattern &pattern) override;
void visit (HIR::WildcardPattern &pattern) override;
void visit (HIR::RangePattern &pattern) override;
-
- // unsupported
- void visit (HIR::AltPattern &pattern) override
- {
- rust_sorry_at (pattern.get_locus (),
- "alternate pattern case labels not supported");
- }
+ void visit (HIR::AltPattern &pattern) override;
// Empty visit for unused Pattern HIR nodes.
void visit (HIR::IdentifierPattern &) override {}
@@ -80,14 +74,8 @@ public:
void visit (HIR::ReferencePattern &pattern) override;
void visit (HIR::IdentifierPattern &) override;
- // unsupported
- void visit (HIR::AltPattern &pattern) override
- {
- rust_sorry_at (pattern.get_locus (),
- "alternate pattern bindings not supported");
- }
-
// Empty visit for unused Pattern HIR nodes.
+ void visit (HIR::AltPattern &) override {}
void visit (HIR::LiteralPattern &) override {}
void visit (HIR::PathInExpression &) override {}
void visit (HIR::QualifiedPathInExpression &) override {}
diff --git a/gcc/rust/typecheck/rust-hir-type-check-pattern.cc b/gcc/rust/typecheck/rust-hir-type-check-pattern.cc
index 9a74e159f1b..eacdd7cf1a2 100644
--- a/gcc/rust/typecheck/rust-hir-type-check-pattern.cc
+++ b/gcc/rust/typecheck/rust-hir-type-check-pattern.cc
@@ -473,8 +473,28 @@ TypeCheckPattern::typecheck_range_pattern_bound (
void
TypeCheckPattern::visit (HIR::AltPattern &pattern)
{
- rust_sorry_at (pattern.get_locus (),
- "type checking alternate patterns not supported");
+ const auto &alts = pattern.get_alts ();
+
+ // lub - taken from TypeCheckExpr::visit(ArrayExpr)
+ std::vector<TyTy::BaseType *> types;
+ for (auto &alt_pattern : alts)
+ {
+ types.push_back (TypeCheckPattern::Resolve (alt_pattern.get (), parent));
+ }
+
+ TyTy::BaseType *alt_pattern_type
+ = TyTy::TyVar::get_implicit_infer_var (pattern.get_locus ()).get_tyty ();
+
+ for (auto &type : types)
+ {
+ alt_pattern_type
+ = unify_site (pattern.get_pattern_mappings ().get_hirid (),
+ TyTy::TyWithLocation (alt_pattern_type),
+ TyTy::TyWithLocation (type, type->get_locus ()),
+ pattern.get_locus ());
+ }
+
+ infered = alt_pattern_type;
}
TyTy::BaseType *
diff --git a/gcc/testsuite/rust/compile/issue-2431.rs b/gcc/testsuite/rust/compile/issue-2431.rs
new file mode 100644
index 00000000000..b1bae0dbfcd
--- /dev/null
+++ b/gcc/testsuite/rust/compile/issue-2431.rs
@@ -0,0 +1,6 @@
+pub fn main() {
+ match 12 {
+ 12 | 13 | 14 => {}
+ _ => {}
+ }
+}
More information about the Gcc-cvs
mailing list