Disallow instructions as a switch expression

This commit is contained in:
Alex Beregszaszi 2017-05-24 14:33:10 +01:00
parent d745dd6542
commit c64bd33784
2 changed files with 3 additions and 1 deletions

View File

@ -72,6 +72,8 @@ assembly::Statement Parser::parseStatement()
assembly::Switch _switch = createWithLocation<assembly::Switch>(); assembly::Switch _switch = createWithLocation<assembly::Switch>();
m_scanner->next(); m_scanner->next();
_switch.expression = make_shared<Statement>(parseExpression()); _switch.expression = make_shared<Statement>(parseExpression());
if (_switch.expression->type() == typeid(assembly::Instruction))
fatalParserError("Instructions are not supported as expressions for switch.");
while (m_scanner->currentToken() == Token::Case) while (m_scanner->currentToken() == Token::Case)
_switch.cases.emplace_back(parseCase()); _switch.cases.emplace_back(parseCase());
if (m_scanner->currentToken() == Token::Default) if (m_scanner->currentToken() == Token::Default)

View File

@ -230,7 +230,6 @@ BOOST_AUTO_TEST_CASE(switch_statement)
BOOST_CHECK(successParse("{ switch 42 case 1 {} case 2 {} }")); BOOST_CHECK(successParse("{ switch 42 case 1 {} case 2 {} }"));
BOOST_CHECK(successParse("{ switch 42 case 1 {} default {} }")); BOOST_CHECK(successParse("{ switch 42 case 1 {} default {} }"));
BOOST_CHECK(successParse("{ switch 42 case 1 {} case 2 {} default {} }")); BOOST_CHECK(successParse("{ switch 42 case 1 {} case 2 {} default {} }"));
BOOST_CHECK(successParse("{ 1 2 switch mul case 1 {} case 2 {} default {} }"));
BOOST_CHECK(successParse("{ switch mul(1, 2) case 1 {} case 2 {} default {} }")); BOOST_CHECK(successParse("{ switch mul(1, 2) case 1 {} case 2 {} default {} }"));
BOOST_CHECK(successParse("{ function f() -> x {} switch f() case 1 {} case 2 {} default {} }")); BOOST_CHECK(successParse("{ function f() -> x {} switch f() case 1 {} case 2 {} default {} }"));
} }
@ -248,6 +247,7 @@ BOOST_AUTO_TEST_CASE(switch_duplicate_case)
BOOST_AUTO_TEST_CASE(switch_invalid_expression) BOOST_AUTO_TEST_CASE(switch_invalid_expression)
{ {
CHECK_PARSE_ERROR("{ switch {} default {} }", ParserError, "Expected elementary inline assembly operation."); CHECK_PARSE_ERROR("{ switch {} default {} }", ParserError, "Expected elementary inline assembly operation.");
CHECK_PARSE_ERROR("{ 1 2 switch mul default {} }", ParserError, "Instructions are not supported as expressions for switch.");
} }
BOOST_AUTO_TEST_CASE(switch_default_before_case) BOOST_AUTO_TEST_CASE(switch_default_before_case)