diff options
author | John Hodge <tpg@mutabah.net> | 2016-10-19 15:07:50 +0800 |
---|---|---|
committer | John Hodge <tpg@mutabah.net> | 2016-10-19 15:07:50 +0800 |
commit | d59f99245160b865bde1b043dce8db69c713445b (patch) | |
tree | 2eac8061fe1c2584b93afe8b01904646377574fa /src | |
parent | 7b4f5efee4484b856652ac9c86409cb6dee1941b (diff) | |
download | mrust-d59f99245160b865bde1b043dce8db69c713445b.tar.gz |
HIR Const Eval - Allow indexing
Diffstat (limited to 'src')
-rw-r--r-- | src/hir_conv/constant_evaluation.cpp | 21 |
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); |