Skip to content

Commit 94cbaa2

Browse files
powerboat9philberty
authored andcommitted
Add AltPattern HIR node
Example: match x { 0 | 1 => true, _ => false } gcc/rust/ChangeLog: * backend/rust-compile-fnparam.h: (CompileFnParam::visit): Add AltPattern visitor. * backend/rust-compile-pattern.h: (CompilePatternCaseLabelExpr::visit): Add AltPattern visitor. (CompilePatternBindings::visit): Add AltPattern visitor. (CompilePatternLet::visit): Add AltPattern visitor. * backend/rust-compile-resolve-path.h: (ResolvePathRef::visit): Add AltPattern visitor. * backend/rust-compile-var-decl.h: (CompileVarDecl::visit): Add AltPattern visitor. * checks/errors/rust-const-checker.cc (ConstChecker::visit): Add AltPattern visitor. * checks/errors/rust-const-checker.h: (ConstChecker::visit): Add AltPattern visitor. * checks/errors/rust-unsafe-checker.cc (UnsafeChecker::visit): Add AltPattern visitor. * checks/errors/rust-unsafe-checker.h: (UnsafeChecker::visit): Add AltPattern visitor. * hir/rust-hir-dump.cc (Dump::visit): Add AltPattern visitor. * hir/rust-hir-dump.h: (Dump::visit): Add AltPattern visitor. * hir/tree/rust-hir-full-decls.h (class AltPattern): Add forward declaration. * hir/tree/rust-hir-pattern.h (class AltPattern): New class. * hir/tree/rust-hir-visitor.h: (HIRFullVisitor::visit): Add AltPattern visitor. (HIRFullVisitorBase::visit): Add AltPattern visitor. (HIRPatternVisitor::visit): Add AltPattern visitor. * hir/tree/rust-hir.h: (Pattern::PatternType::ALT): New enumerator. * typecheck/rust-hir-type-check-pattern.cc (TypeCheckPattern::visit): Add AltPattern visitor. * typecheck/rust-hir-type-check-pattern.h: (TypeCheckPattern::visit): Add AltPattern visitor. Signed-off-by: Owen Avery <[email protected]>
1 parent f6e926a commit 94cbaa2

16 files changed

+117
-0
lines changed

gcc/rust/backend/rust-compile-fnparam.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ class CompileFnParam : private HIRCompileBase, protected HIR::HIRPatternVisitor
3939
void visit (HIR::TupleStructPattern &) override;
4040

4141
// Empty visit for unused Pattern HIR nodes.
42+
void visit (HIR::AltPattern &) override {}
4243
void visit (HIR::LiteralPattern &) override {}
4344
void visit (HIR::PathInExpression &) override {}
4445
void visit (HIR::QualifiedPathInExpression &) override {}

gcc/rust/backend/rust-compile-pattern.h

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,13 @@ class CompilePatternCaseLabelExpr : public HIRCompileBase,
3939
void visit (HIR::WildcardPattern &pattern) override;
4040
void visit (HIR::RangePattern &pattern) override;
4141

42+
// unsupported
43+
void visit (HIR::AltPattern &pattern) override
44+
{
45+
rust_sorry_at (pattern.get_locus (),
46+
"alternate pattern case labels not supported");
47+
}
48+
4249
// Empty visit for unused Pattern HIR nodes.
4350
void visit (HIR::IdentifierPattern &) override {}
4451
void visit (HIR::LiteralPattern &) override;
@@ -70,6 +77,13 @@ class CompilePatternBindings : public HIRCompileBase,
7077
void visit (HIR::StructPattern &pattern) override;
7178
void visit (HIR::TupleStructPattern &pattern) override;
7279

80+
// unsupported
81+
void visit (HIR::AltPattern &pattern) override
82+
{
83+
rust_sorry_at (pattern.get_locus (),
84+
"alternate pattern bindings not supported");
85+
}
86+
7387
// Empty visit for unused Pattern HIR nodes.
7488
void visit (HIR::IdentifierPattern &) override {}
7589
void visit (HIR::LiteralPattern &) override {}
@@ -104,6 +118,12 @@ class CompilePatternLet : public HIRCompileBase, public HIR::HIRPatternVisitor
104118
void visit (HIR::TuplePattern &) override;
105119

106120
// check for unimplemented Pattern HIR nodes.
121+
void visit (HIR::AltPattern &pattern) override
122+
{
123+
rust_sorry_at (pattern.get_locus (),
124+
"alternate pattern let statements not supported");
125+
}
126+
107127
void visit (HIR::LiteralPattern &pattern) override
108128
{
109129
rust_sorry_at (pattern.get_locus (),

gcc/rust/backend/rust-compile-resolve-path.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ class ResolvePathRef : public HIRCompileBase, public HIR::HIRPatternVisitor
5050
void visit (HIR::RangePattern &) override {}
5151
void visit (HIR::ReferencePattern &) override {}
5252
void visit (HIR::SlicePattern &) override {}
53+
void visit (HIR::AltPattern &) override {}
5354
void visit (HIR::StructPattern &) override {}
5455
void visit (HIR::TuplePattern &) override {}
5556
void visit (HIR::TupleStructPattern &) override {}

gcc/rust/backend/rust-compile-var-decl.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ class CompileVarDecl : public HIRCompileBase, public HIR::HIRPatternVisitor
5454
}
5555

5656
// Empty visit for unused Pattern HIR nodes.
57+
void visit (HIR::AltPattern &) override {}
5758
void visit (HIR::LiteralPattern &) override {}
5859
void visit (HIR::PathInExpression &) override {}
5960
void visit (HIR::QualifiedPathInExpression &) override {}

gcc/rust/checks/errors/rust-const-checker.cc

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -838,6 +838,10 @@ void
838838
ConstChecker::visit (SlicePattern &)
839839
{}
840840

841+
void
842+
ConstChecker::visit (AltPattern &)
843+
{}
844+
841845
void
842846
ConstChecker::visit (EmptyStmt &)
843847
{}

gcc/rust/checks/errors/rust-const-checker.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,7 @@ class ConstChecker : public HIRFullVisitor
187187
virtual void visit (TuplePatternItemsRanged &tuple_items) override;
188188
virtual void visit (TuplePattern &pattern) override;
189189
virtual void visit (SlicePattern &pattern) override;
190+
virtual void visit (AltPattern &pattern) override;
190191
virtual void visit (EmptyStmt &stmt) override;
191192
virtual void visit (LetStmt &stmt) override;
192193
virtual void visit (ExprStmtWithoutBlock &stmt) override;

gcc/rust/checks/errors/rust-unsafe-checker.cc

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -905,6 +905,10 @@ void
905905
UnsafeChecker::visit (SlicePattern &)
906906
{}
907907

908+
void
909+
UnsafeChecker::visit (AltPattern &)
910+
{}
911+
908912
void
909913
UnsafeChecker::visit (EmptyStmt &)
910914
{}

gcc/rust/checks/errors/rust-unsafe-checker.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,7 @@ class UnsafeChecker : public HIRFullVisitor
169169
virtual void visit (TuplePatternItemsRanged &tuple_items) override;
170170
virtual void visit (TuplePattern &pattern) override;
171171
virtual void visit (SlicePattern &pattern) override;
172+
virtual void visit (AltPattern &pattern) override;
172173
virtual void visit (EmptyStmt &stmt) override;
173174
virtual void visit (LetStmt &stmt) override;
174175
virtual void visit (ExprStmtWithoutBlock &stmt) override;

gcc/rust/hir/rust-hir-dump.cc

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -580,6 +580,9 @@ Dump::visit (TuplePattern &)
580580
void
581581
Dump::visit (SlicePattern &)
582582
{}
583+
void
584+
Dump::visit (AltPattern &)
585+
{}
583586

584587
void
585588
Dump::visit (EmptyStmt &)

gcc/rust/hir/rust-hir-dump.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,7 @@ class Dump : public HIRFullVisitor
164164
virtual void visit (TuplePatternItemsRanged &) override;
165165
virtual void visit (TuplePattern &) override;
166166
virtual void visit (SlicePattern &) override;
167+
virtual void visit (AltPattern &) override;
167168

168169
virtual void visit (EmptyStmt &) override;
169170
virtual void visit (LetStmt &) override;

gcc/rust/hir/tree/rust-hir-full-decls.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -207,6 +207,7 @@ class TuplePatternItemsMultiple;
207207
class TuplePatternItemsRanged;
208208
class TuplePattern;
209209
class SlicePattern;
210+
class AltPattern;
210211

211212
// rust-type.h
212213
class TraitBound;

gcc/rust/hir/tree/rust-hir-pattern.h

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1300,6 +1300,73 @@ class SlicePattern : public Pattern
13001300
}
13011301
};
13021302

1303+
// HIR node for alternative patterns
1304+
class AltPattern : public Pattern
1305+
{
1306+
std::vector<std::unique_ptr<Pattern>> alts;
1307+
Location locus;
1308+
Analysis::NodeMapping mappings;
1309+
1310+
public:
1311+
public:
1312+
std::string as_string () const override;
1313+
1314+
AltPattern (Analysis::NodeMapping mappings,
1315+
std::vector<std::unique_ptr<Pattern>> alts, Location locus)
1316+
: alts (std::move (alts)), locus (locus), mappings (mappings)
1317+
{}
1318+
1319+
// Copy constructor with vector clone
1320+
AltPattern (AltPattern const &other)
1321+
: locus (other.locus), mappings (other.mappings)
1322+
{
1323+
alts.reserve (other.alts.size ());
1324+
for (const auto &e : other.alts)
1325+
alts.push_back (e->clone_pattern ());
1326+
}
1327+
1328+
// Overloaded assignment operator to vector clone
1329+
AltPattern &operator= (AltPattern const &other)
1330+
{
1331+
locus = other.locus;
1332+
mappings = other.mappings;
1333+
1334+
alts.clear ();
1335+
alts.reserve (other.alts.size ());
1336+
for (const auto &e : other.alts)
1337+
alts.push_back (e->clone_pattern ());
1338+
1339+
return *this;
1340+
}
1341+
1342+
// move constructors
1343+
AltPattern (AltPattern &&other) = default;
1344+
AltPattern &operator= (AltPattern &&other) = default;
1345+
1346+
Location get_locus () const override { return locus; }
1347+
1348+
void accept_vis (HIRFullVisitor &vis) override;
1349+
void accept_vis (HIRPatternVisitor &vis) override;
1350+
1351+
Analysis::NodeMapping get_pattern_mappings () const override final
1352+
{
1353+
return mappings;
1354+
}
1355+
1356+
PatternType get_pattern_type () const override final
1357+
{
1358+
return PatternType::ALT;
1359+
}
1360+
1361+
protected:
1362+
/* Use covariance to implement clone function as returning this object rather
1363+
* than base */
1364+
AltPattern *clone_pattern_impl () const override
1365+
{
1366+
return new AltPattern (*this);
1367+
}
1368+
};
1369+
13031370
// Moved definition to rust-path.h
13041371
class PathPattern;
13051372

gcc/rust/hir/tree/rust-hir-visitor.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,7 @@ class HIRFullVisitor
139139
virtual void visit (TuplePatternItemsRanged &tuple_items) = 0;
140140
virtual void visit (TuplePattern &pattern) = 0;
141141
virtual void visit (SlicePattern &pattern) = 0;
142+
virtual void visit (AltPattern &pattern) = 0;
142143
virtual void visit (EmptyStmt &stmt) = 0;
143144
virtual void visit (LetStmt &stmt) = 0;
144145
virtual void visit (ExprStmtWithoutBlock &stmt) = 0;
@@ -290,6 +291,7 @@ class HIRFullVisitorBase : public HIRFullVisitor
290291
virtual void visit (TuplePatternItemsRanged &) override {}
291292
virtual void visit (TuplePattern &) override {}
292293
virtual void visit (SlicePattern &) override {}
294+
virtual void visit (AltPattern &) override {}
293295

294296
virtual void visit (EmptyStmt &) override {}
295297
virtual void visit (LetStmt &) override {}
@@ -475,6 +477,7 @@ class HIRPatternVisitor
475477
virtual void visit (RangePattern &) = 0;
476478
virtual void visit (ReferencePattern &) = 0;
477479
virtual void visit (SlicePattern &) = 0;
480+
virtual void visit (AltPattern &) = 0;
478481
virtual void visit (StructPattern &) = 0;
479482
virtual void visit (TuplePattern &) = 0;
480483
virtual void visit (TupleStructPattern &) = 0;

gcc/rust/hir/tree/rust-hir.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -384,6 +384,7 @@ class Pattern : public Node
384384
TUPLE,
385385
GROUPED,
386386
SLICE,
387+
ALT
387388
};
388389

389390
BaseKind get_hir_kind () override final { return PATTERN; }

gcc/rust/typecheck/rust-hir-type-check-pattern.cc

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -437,5 +437,12 @@ TypeCheckPattern::emit_pattern_size_error (const HIR::Pattern &pattern,
437437
got_field_count == 1 ? "element" : "elements");
438438
}
439439

440+
void
441+
TypeCheckPattern::visit (HIR::AltPattern &pattern)
442+
{
443+
rust_sorry_at (pattern.get_locus (),
444+
"type checking alternate patterns not supported");
445+
}
446+
440447
} // namespace Resolver
441448
} // namespace Rust

gcc/rust/typecheck/rust-hir-type-check-pattern.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ class TypeCheckPattern : public TypeCheckBase, public HIR::HIRPatternVisitor
4242
void visit (HIR::QualifiedPathInExpression &pattern) override;
4343
void visit (HIR::ReferencePattern &pattern) override;
4444
void visit (HIR::SlicePattern &pattern) override;
45+
void visit (HIR::AltPattern &pattern) override;
4546

4647
private:
4748
TypeCheckPattern (TyTy::BaseType *parent);

0 commit comments

Comments
 (0)