aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorDave Evans <dave@dmetwo.org>2023-08-24 14:10:42 -0500
committerPhilip Herron <philip.herron@embecosm.com>2023-09-12 10:20:21 +0000
commitd574b41ea1e6bfc2dff98ff01a284d72d5dd82eb (patch)
treeb4680433e02f9c3f1f99e7532472809f16af5943 /gcc
parent1ee78b3892f45b3a57ee3357ef8c988ad354a183 (diff)
downloadgcc-d574b41ea1e6bfc2dff98ff01a284d72d5dd82eb.zip
gcc-d574b41ea1e6bfc2dff98ff01a284d72d5dd82eb.tar.gz
gcc-d574b41ea1e6bfc2dff98ff01a284d72d5dd82eb.tar.bz2
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>
Diffstat (limited to 'gcc')
-rw-r--r--gcc/rust/backend/rust-compile-pattern.cc11
-rw-r--r--gcc/rust/backend/rust-compile-pattern.h16
-rw-r--r--gcc/rust/typecheck/rust-hir-type-check-pattern.cc24
-rw-r--r--gcc/testsuite/rust/compile/issue-2431.rs6
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 e84fb6b..05bd94d 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 5f02a74..78121e5 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 ea744a6..0786f89 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 0000000..b1bae0d
--- /dev/null
+++ b/gcc/testsuite/rust/compile/issue-2431.rs
@@ -0,0 +1,6 @@
+pub fn main() {
+ match 12 {
+ 12 | 13 | 14 => {}
+ _ => {}
+ }
+}