diff options
author | chriseth <chris@ethereum.org> | 2018-02-23 18:42:53 +0800 |
---|---|---|
committer | chriseth <chris@ethereum.org> | 2018-03-02 00:19:35 +0800 |
commit | dc317a44e031d45ebf745b47248bf06bc92d58bf (patch) | |
tree | d03753c0d0ff0672669e0e8ecb70db84f73f6a7f /libsolidity/inlineasm/AsmAnalysis.cpp | |
parent | a53d6b499d5cc5c45fc096cea6393dc285581f90 (diff) | |
download | dexon-solidity-dc317a44e031d45ebf745b47248bf06bc92d58bf.tar dexon-solidity-dc317a44e031d45ebf745b47248bf06bc92d58bf.tar.gz dexon-solidity-dc317a44e031d45ebf745b47248bf06bc92d58bf.tar.bz2 dexon-solidity-dc317a44e031d45ebf745b47248bf06bc92d58bf.tar.lz dexon-solidity-dc317a44e031d45ebf745b47248bf06bc92d58bf.tar.xz dexon-solidity-dc317a44e031d45ebf745b47248bf06bc92d58bf.tar.zst dexon-solidity-dc317a44e031d45ebf745b47248bf06bc92d58bf.zip |
Provide EVM version to assembly analysis.
Diffstat (limited to 'libsolidity/inlineasm/AsmAnalysis.cpp')
-rw-r--r-- | libsolidity/inlineasm/AsmAnalysis.cpp | 32 |
1 files changed, 23 insertions, 9 deletions
diff --git a/libsolidity/inlineasm/AsmAnalysis.cpp b/libsolidity/inlineasm/AsmAnalysis.cpp index 1030523a..efa0410d 100644 --- a/libsolidity/inlineasm/AsmAnalysis.cpp +++ b/libsolidity/inlineasm/AsmAnalysis.cpp @@ -533,19 +533,33 @@ void AsmAnalyzer::expectValidType(string const& type, SourceLocation const& _loc void AsmAnalyzer::warnOnInstructions(solidity::Instruction _instr, SourceLocation const& _location) { - static set<solidity::Instruction> futureInstructions{ - solidity::Instruction::CREATE2, - solidity::Instruction::RETURNDATACOPY, - solidity::Instruction::RETURNDATASIZE, - solidity::Instruction::STATICCALL - }; - if (futureInstructions.count(_instr)) + // We assume that returndatacopy, returndatasize and staticcall are either all available + // or all not available. + solAssert(m_evmVersion.supportsReturndata() == m_evmVersion.hasStaticCall(), ""); + + if (_instr == solidity::Instruction::CREATE2) m_errorReporter.warning( _location, "The \"" + boost::to_lower_copy(instructionInfo(_instr).name) - + "\" instruction is only available after " + - "the Metropolis hard fork. Before that it acts as an invalid instruction." + + "\" instruction is not supported by the VM version \"" + + "" + m_evmVersion.name() + + "\" you are currently compiling for. " + + "It will be interpreted as an invalid instruction on this VM." + ); + else if (( + _instr == solidity::Instruction::RETURNDATACOPY || + _instr == solidity::Instruction::RETURNDATASIZE || + _instr == solidity::Instruction::STATICCALL + ) && !m_evmVersion.supportsReturndata()) + m_errorReporter.warning( + _location, + "The \"" + + boost::to_lower_copy(instructionInfo(_instr).name) + + "\" instruction is only available for Byzantium-compatible VMs. " + + "You are currently compiling for \"" + + m_evmVersion.name() + + "\", where it will be interpreted as an invalid instruction." ); static set<solidity::Instruction> experimentalInstructions{ |