std::string
LiteralPattern::as_string () const
{
- return lit.as_string ();
+ return (has_minus ? "-" : "") + lit.as_string ();
}
std::string
Literal lit;
location_t locus;
NodeId node_id;
+ bool has_minus;
public:
std::string as_string () const override;
// Constructor for a literal pattern
LiteralPattern (Literal lit, location_t locus)
: lit (std::move (lit)), locus (locus),
- node_id (Analysis::Mappings::get ().get_next_node_id ())
+ node_id (Analysis::Mappings::get ().get_next_node_id ()),
+ has_minus (false)
+ {}
+
+ LiteralPattern (Literal lit, location_t locus, bool has_minus)
+ : lit (std::move (lit)), locus (locus),
+ node_id (Analysis::Mappings::get ().get_next_node_id ()),
+ has_minus (has_minus)
{}
LiteralPattern (std::string val, Literal::LitType type, location_t locus,
PrimitiveCoreType type_hint)
: lit (Literal (std::move (val), type, type_hint)), locus (locus),
- node_id (Analysis::Mappings::get ().get_next_node_id ())
+ node_id (Analysis::Mappings::get ().get_next_node_id ()),
+ has_minus (false)
+ {}
+
+ LiteralPattern (std::string val, Literal::LitType type, location_t locus,
+ PrimitiveCoreType type_hint, bool has_minus)
+ : lit (Literal (std::move (val), type, type_hint)), locus (locus),
+ node_id (Analysis::Mappings::get ().get_next_node_id ()),
+ has_minus (has_minus)
{}
location_t get_locus () const override final { return locus; }
+ bool get_has_minus () const { return has_minus; }
+
void accept_vis (ASTVisitor &vis) override;
NodeId get_node_id () const override { return node_id; }
auto litexpr = std::make_unique<HIR::LiteralExpr> (
HIR::LiteralExpr (pattern.get_mappings (), pattern.get_literal (),
pattern.get_locus (), std::vector<AST::Attribute> ()));
+ if (pattern.get_has_minus ())
+ litexpr->set_negative ();
// Note: Floating point literals are currently accepted but will likely be
// forbidden in LiteralPatterns in a future version of Rust.
HIR::Literal l = lower_literal (pattern.get_literal ());
translated
- = new HIR::LiteralPattern (mapping, std::move (l), pattern.get_locus ());
+ = new HIR::LiteralPattern (mapping, std::move (l), pattern.get_locus (),
+ pattern.get_has_minus ());
}
void
Literal lit;
location_t locus;
Analysis::NodeMapping mappings;
+ bool has_minus;
public:
std::string as_string () const override;
// Constructor for a literal pattern
LiteralPattern (Analysis::NodeMapping mappings, Literal lit, location_t locus)
- : lit (std::move (lit)), locus (locus), mappings (mappings)
+ : lit (std::move (lit)), locus (locus), mappings (mappings),
+ has_minus (false)
+ {}
+
+ LiteralPattern (Analysis::NodeMapping mappings, Literal lit, location_t locus,
+ bool has_minus)
+ : lit (std::move (lit)), locus (locus), mappings (mappings),
+ has_minus (has_minus)
{}
LiteralPattern (Analysis::NodeMapping mappings, std::string val,
Literal::LitType type, location_t locus)
: lit (Literal (std::move (val), type, PrimitiveCoreType::CORETYPE_STR)),
- locus (locus), mappings (mappings)
+ locus (locus), mappings (mappings), has_minus (false)
{}
location_t get_locus () const override { return locus; }
Literal &get_literal () { return lit; }
const Literal &get_literal () const { return lit; }
+ bool get_has_minus () const { return has_minus; }
+
protected:
/* Use covariance to implement clone function as returning this object rather
* than base */
std::string
LiteralPattern::as_string () const
{
- return lit.as_string ();
+ return (has_minus ? "-" : "") + lit.as_string ();
}
std::string
return std::unique_ptr<AST::LiteralPattern> (
new AST::LiteralPattern (range_lower->get_str (), type,
range_lower->get_locus (),
- range_lower->get_type_hint ()));
+ range_lower->get_type_hint (), has_minus));
}
}
--- /dev/null
+fn main() -> i32 {
+ let x = -55;
+
+ match x {
+ 55 => 1,
+ -55 => 0, // correct case
+ _ => 1
+ }
+}
\ No newline at end of file