Visitor bugfix.

This commit is contained in:
chriseth 2017-06-07 11:40:47 +02:00
parent 893e6f4ec2
commit b32d5e4cc0
2 changed files with 18 additions and 6 deletions

View File

@ -277,8 +277,12 @@ bool AsmAnalyzer::operator()(Switch const& _switch)
{ {
if (_case.value) if (_case.value)
{ {
if (!expectExpression(*_case.value)) int const initialStackHeight = m_stackHeight;
// We cannot use "expectExpression" here because *_case.value is not a
// Statement and would be converted to a Statement otherwise.
if (!(*this)(*_case.value))
success = false; success = false;
expectDeposit(1, initialStackHeight, _case.value->location);
m_stackHeight--; m_stackHeight--;
/// Note: the parser ensures there is only one default case /// Note: the parser ensures there is only one default case
@ -345,17 +349,24 @@ bool AsmAnalyzer::expectExpression(Statement const& _statement)
int const initialHeight = m_stackHeight; int const initialHeight = m_stackHeight;
if (!boost::apply_visitor(*this, _statement)) if (!boost::apply_visitor(*this, _statement))
success = false; success = false;
if (m_stackHeight - initialHeight != 1) if (!expectDeposit(1, initialHeight, locationOf(_statement)))
success = false;
return success;
}
bool AsmAnalyzer::expectDeposit(int _deposit, int _oldHeight, SourceLocation const& _location)
{
if (m_stackHeight - _oldHeight != _deposit)
{ {
m_errorReporter.typeError( m_errorReporter.typeError(
locationOf(_statement), _location,
"Expected expression to return one item to the stack, but did return " + "Expected expression to return one item to the stack, but did return " +
boost::lexical_cast<string>(m_stackHeight - initialHeight) + boost::lexical_cast<string>(m_stackHeight - _oldHeight) +
" items." " items."
); );
success = false; return false;
} }
return success; return true;
} }
bool AsmAnalyzer::checkAssignment(assembly::Identifier const& _variable, size_t _valueSize) bool AsmAnalyzer::checkAssignment(assembly::Identifier const& _variable, size_t _valueSize)

View File

@ -89,6 +89,7 @@ public:
private: private:
/// Visits the statement and expects it to deposit one item onto the stack. /// Visits the statement and expects it to deposit one item onto the stack.
bool expectExpression(Statement const& _statement); bool expectExpression(Statement const& _statement);
bool expectDeposit(int _deposit, int _oldHeight, SourceLocation const& _location);
/// Verifies that a variable to be assigned to exists and has the same size /// Verifies that a variable to be assigned to exists and has the same size
/// as the value, @a _valueSize, unless that is equal to -1. /// as the value, @a _valueSize, unless that is equal to -1.