summaryrefslogtreecommitdiff
path: root/src/macro_rules
diff options
context:
space:
mode:
Diffstat (limited to 'src/macro_rules')
-rw-r--r--src/macro_rules/eval.cpp6
1 files changed, 5 insertions, 1 deletions
diff --git a/src/macro_rules/eval.cpp b/src/macro_rules/eval.cpp
index 03c5609c..9caff7b8 100644
--- a/src/macro_rules/eval.cpp
+++ b/src/macro_rules/eval.cpp
@@ -352,8 +352,10 @@ void MacroPatternStream::if_succeeded()
TU_MATCH_HDRA( (m_simple_ents[m_cur_pos-1]), {)
default:
BUG(Span(), "Unexpected " << m_simple_ents[m_cur_pos-1]);
- TU_ARMA(If, e)
+ TU_ARMA(If, e) {
+ ASSERT_BUG(Span(), e.jump_target < m_simple_ents.size(), "Jump target " << e.jump_target << " out of range " << m_simple_ents.size());
m_cur_pos = e.jump_target;
+ }
}
m_condition_met = true;
}
@@ -1724,6 +1726,7 @@ namespace
unsigned int Macro_InvokeRules_MatchPattern(const Span& sp, const MacroRules& rules, TokenTree input, AST::Module& mod, ParameterMappings& bound_tts)
{
TRACE_FUNCTION;
+ ASSERT_BUG(sp, rules.m_rules.size() > 0, "Empty macro_rules set");
::std::vector< ::std::pair<size_t, ::std::vector<bool>> > matches;
for(size_t i = 0; i < rules.m_rules.size(); i ++)
@@ -1812,6 +1815,7 @@ unsigned int Macro_InvokeRules_MatchPattern(const Span& sp, const MacroRules& ru
if( matches.size() == 0 )
{
// ERROR!
+ // TODO: Keep track of where each arm failed.
TODO(sp, "No arm matched");
}
else