summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJohn Hodge <tpg@mutabah.net>2016-10-19 15:07:50 +0800
committerJohn Hodge <tpg@mutabah.net>2016-10-19 15:07:50 +0800
commitd59f99245160b865bde1b043dce8db69c713445b (patch)
tree2eac8061fe1c2584b93afe8b01904646377574fa /src
parent7b4f5efee4484b856652ac9c86409cb6dee1941b (diff)
downloadmrust-d59f99245160b865bde1b043dce8db69c713445b.tar.gz
HIR Const Eval - Allow indexing
Diffstat (limited to 'src')
-rw-r--r--src/hir_conv/constant_evaluation.cpp21
1 files changed, 18 insertions, 3 deletions
diff --git a/src/hir_conv/constant_evaluation.cpp b/src/hir_conv/constant_evaluation.cpp
index d6940982..0664f425 100644
--- a/src/hir_conv/constant_evaluation.cpp
+++ b/src/hir_conv/constant_evaluation.cpp
@@ -221,7 +221,7 @@ namespace {
{}
void badnode(const ::HIR::ExprNode& node) const {
- ERROR(node.span(), E0000, "Node not allowed in constant expression");
+ ERROR(node.span(), E0000, "Node " << typeid(node).name() << " not allowed in constant expression");
}
void visit(::HIR::ExprNode_Block& node) override {
@@ -262,7 +262,7 @@ namespace {
auto right = mv$(m_rv);
if( left.tag() != right.tag() ) {
- ERROR(node.span(), E0000, "ExprNode_BinOp - Sides mismatched");
+ ERROR(node.span(), E0000, "ExprNode_BinOp - Types mismatched - " << left.tag_str() << " != " << right.tag_str());
}
switch(node.m_op)
@@ -408,7 +408,22 @@ namespace {
//DEBUG("ExprNode_Unsize - val = " << val << " as " << node.m_type);
}
void visit(::HIR::ExprNode_Index& node) override {
- badnode(node);
+ // Index
+ node.m_index->visit(*this);
+ if( !m_rv.is_Integer() )
+ ERROR(node.span(), E0000, "Array index isn't an integer - got " << m_rv.tag_str());
+ auto idx = m_rv.as_Integer();
+
+ // Value
+ node.m_value->visit(*this);
+ if( !m_rv.is_List() )
+ ERROR(node.span(), E0000, "Indexed value isn't a list - got " << m_rv.tag_str());
+ auto v = mv$( m_rv.as_List() );
+
+ // -> Perform
+ if( idx >= v.size() )
+ ERROR(node.span(), E0000, "Constant array index " << idx << " out of range " << v.size());
+ m_rv = mv$(v[idx]);
}
void visit(::HIR::ExprNode_Deref& node) override {
badnode(node);