summaryrefslogtreecommitdiff
path: root/src/hir_conv/constant_evaluation.cpp
diff options
context:
space:
mode:
authorJohn Hodge <tpg@ucc.asn.au>2017-02-22 13:27:28 +0800
committerJohn Hodge <tpg@ucc.asn.au>2017-02-22 13:27:28 +0800
commite4d8415f346e7067c3f060649c577b947a249e51 (patch)
tree8af7cd07650aaac7a53cd5d560134c0990d82ba0 /src/hir_conv/constant_evaluation.cpp
parenta4ec506e3f3c23c7818c3ce2d020b25966c420d8 (diff)
downloadmrust-e4d8415f346e7067c3f060649c577b947a249e51.tar.gz
MIR - add Param type for places where a lvalue is read
Diffstat (limited to 'src/hir_conv/constant_evaluation.cpp')
-rw-r--r--src/hir_conv/constant_evaluation.cpp87
1 files changed, 51 insertions, 36 deletions
diff --git a/src/hir_conv/constant_evaluation.cpp b/src/hir_conv/constant_evaluation.cpp
index 1baa48ac..b604b510 100644
--- a/src/hir_conv/constant_evaluation.cpp
+++ b/src/hir_conv/constant_evaluation.cpp
@@ -1083,6 +1083,48 @@ namespace {
)
)
};
+ auto const_to_lit = [&](const ::MIR::Constant& c)->::HIR::Literal {
+ TU_MATCH(::MIR::Constant, (c), (e2),
+ (Int,
+ return ::HIR::Literal(static_cast<uint64_t>(e2));
+ ),
+ (Uint,
+ return ::HIR::Literal(e2);
+ ),
+ (Float,
+ return ::HIR::Literal(e2);
+ ),
+ (Bool,
+ return ::HIR::Literal(static_cast<uint64_t>(e2));
+ ),
+ (Bytes,
+ return ::HIR::Literal::make_String({e2.begin(), e2.end()});
+ ),
+ (StaticString,
+ return ::HIR::Literal(e2);
+ ),
+ (Const,
+ auto ent = get_ent_fullpath(sp, crate, e2.p, EntNS::Value);
+ ASSERT_BUG(sp, ent.is_Constant(), "MIR Constant::Const("<<e2.p<<") didn't point to a Constant - " << ent.tag_str());
+ return clone_literal( ent.as_Constant()->m_value_res );
+ ),
+ (ItemAddr,
+ return ::HIR::Literal::make_BorrowOf( e2.clone() );
+ )
+ )
+ throw "";
+ };
+ auto read_param = [&](const ::MIR::Param& p) ->::HIR::Literal {
+ TU_MATCH(::MIR::Param, (p), (e),
+ (LValue,
+ return read_lval(e);
+ ),
+ (Constant,
+ return const_to_lit(e);
+ )
+ )
+ throw "";
+ };
unsigned int cur_block = 0;
for(;;)
@@ -1105,41 +1147,14 @@ namespace {
val = read_lval(e);
),
(Constant,
- TU_MATCH(::MIR::Constant, (e), (e2),
- (Int,
- val = ::HIR::Literal(static_cast<uint64_t>(e2));
- ),
- (Uint,
- val = ::HIR::Literal(e2);
- ),
- (Float,
- val = ::HIR::Literal(e2);
- ),
- (Bool,
- val = ::HIR::Literal(static_cast<uint64_t>(e2));
- ),
- (Bytes,
- val = ::HIR::Literal::make_String({e2.begin(), e2.end()});
- ),
- (StaticString,
- val = ::HIR::Literal(e2);
- ),
- (Const,
- auto ent = get_ent_fullpath(sp, crate, e2.p, EntNS::Value);
- ASSERT_BUG(sp, ent.is_Constant(), "MIR Constant::Const("<<e2.p<<") didn't point to a Constant - " << ent.tag_str());
- val = clone_literal( ent.as_Constant()->m_value_res );
- ),
- (ItemAddr,
- val = ::HIR::Literal::make_BorrowOf( e2.clone() );
- )
- )
+ val = const_to_lit(e);
),
(SizedArray,
::std::vector< ::HIR::Literal> vals;
if( e.count > 0 )
{
vals.reserve( e.count );
- val = read_lval(e.val);
+ val = read_param(e.val);
for(unsigned int i = 1; i < e.count; i++)
vals.push_back( clone_literal(val) );
vals.push_back( mv$(val) );
@@ -1235,8 +1250,8 @@ namespace {
)
),
(BinOp,
- auto inval_l = read_lval(e.val_l);
- auto inval_r = read_lval(e.val_r);
+ auto inval_l = read_param(e.val_l);
+ auto inval_r = read_param(e.val_r);
ASSERT_BUG(sp, inval_l.tag() == inval_r.tag(), "Mismatched literal types in binop - " << inval_l << " and " << inval_r);
TU_MATCH_DEF( ::HIR::Literal, (inval_l, inval_r), (l, r),
(
@@ -1337,7 +1352,7 @@ namespace {
),
(MakeDst,
auto ptr = read_lval(e.ptr_val);
- auto meta = read_lval(e.meta_val);
+ auto meta = read_param(e.meta_val);
if( ! meta.is_Integer() ) {
TODO(sp, "RValue::MakeDst - (non-integral meta) " << ptr << " , " << meta);
}
@@ -1349,14 +1364,14 @@ namespace {
::std::vector< ::HIR::Literal> vals;
vals.reserve( e.vals.size() );
for(const auto& v : e.vals)
- vals.push_back( read_lval(v) );
+ vals.push_back( read_param(v) );
val = ::HIR::Literal::make_List( mv$(vals) );
),
(Array,
::std::vector< ::HIR::Literal> vals;
vals.reserve( e.vals.size() );
for(const auto& v : e.vals)
- vals.push_back( read_lval(v) );
+ vals.push_back( read_param(v) );
val = ::HIR::Literal::make_List( mv$(vals) );
),
(Variant,
@@ -1366,7 +1381,7 @@ namespace {
::std::vector< ::HIR::Literal> vals;
vals.reserve( e.vals.size() );
for(const auto& v : e.vals)
- vals.push_back( read_lval(v) );
+ vals.push_back( read_param(v) );
val = ::HIR::Literal::make_List( mv$(vals) );
)
)
@@ -1436,7 +1451,7 @@ namespace {
::std::vector< ::HIR::Literal> call_args;
call_args.reserve( e.args.size() );
for(const auto& a : e.args)
- call_args.push_back( read_lval(a) );
+ call_args.push_back( read_param(a) );
// TODO: Set m_const during parse and check here
// Call by invoking evaluate_constant on the function