diff options
author | Alex Beregszaszi <alex@rtfs.hu> | 2017-05-24 21:33:10 +0800 |
---|---|---|
committer | Alex Beregszaszi <alex@rtfs.hu> | 2017-05-26 10:20:34 +0800 |
commit | c64bd3378427b46b0ae37e5d39e8ca6586d697c2 (patch) | |
tree | 20ed5ed92e856db88a9d3c30dc3ca1d1ac477f3f | |
parent | d745dd6542d488432453035763211fdad78c3a06 (diff) | |
download | dexon-solidity-c64bd3378427b46b0ae37e5d39e8ca6586d697c2.tar.gz dexon-solidity-c64bd3378427b46b0ae37e5d39e8ca6586d697c2.tar.zst dexon-solidity-c64bd3378427b46b0ae37e5d39e8ca6586d697c2.zip |
Disallow instructions as a switch expression
-rw-r--r-- | libsolidity/inlineasm/AsmParser.cpp | 2 | ||||
-rw-r--r-- | test/libsolidity/InlineAssembly.cpp | 2 |
2 files changed, 3 insertions, 1 deletions
diff --git a/libsolidity/inlineasm/AsmParser.cpp b/libsolidity/inlineasm/AsmParser.cpp index 537a39a1..847735f4 100644 --- a/libsolidity/inlineasm/AsmParser.cpp +++ b/libsolidity/inlineasm/AsmParser.cpp @@ -72,6 +72,8 @@ assembly::Statement Parser::parseStatement() assembly::Switch _switch = createWithLocation<assembly::Switch>(); m_scanner->next(); _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) _switch.cases.emplace_back(parseCase()); if (m_scanner->currentToken() == Token::Default) diff --git a/test/libsolidity/InlineAssembly.cpp b/test/libsolidity/InlineAssembly.cpp index 18ee9553..f695e1d1 100644 --- a/test/libsolidity/InlineAssembly.cpp +++ b/test/libsolidity/InlineAssembly.cpp @@ -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 {} 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("{ 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) { 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) |