mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Merge pull request #2265 from roadriverrail/inline_asm_unused_warning
Analyze InlineAssembly for variable use
This commit is contained in:
commit
74d2e7311a
@ -1,6 +1,9 @@
|
|||||||
### 0.4.12 (unreleased)
|
### 0.4.12 (unreleased)
|
||||||
* AST: export all attributes to Json format
|
* AST: export all attributes to Json format
|
||||||
|
|
||||||
|
Bugfixes:
|
||||||
|
* Unused variable warnings no longer issued for variables used inside inline assembly
|
||||||
|
|
||||||
### 0.4.11 (2017-05-03)
|
### 0.4.11 (2017-05-03)
|
||||||
|
|
||||||
Features:
|
Features:
|
||||||
|
@ -21,14 +21,16 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include <libsolidity/analysis/StaticAnalyzer.h>
|
#include <libsolidity/analysis/StaticAnalyzer.h>
|
||||||
#include <memory>
|
|
||||||
#include <libsolidity/ast/AST.h>
|
#include <libsolidity/ast/AST.h>
|
||||||
|
#include <libsolidity/inlineasm/AsmAnalysis.h>
|
||||||
|
#include <libsolidity/inlineasm/AsmAnalysisInfo.h>
|
||||||
|
#include <libsolidity/inlineasm/AsmData.h>
|
||||||
|
#include <memory>
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
using namespace dev;
|
using namespace dev;
|
||||||
using namespace dev::solidity;
|
using namespace dev::solidity;
|
||||||
|
|
||||||
|
|
||||||
bool StaticAnalyzer::analyze(SourceUnit const& _sourceUnit)
|
bool StaticAnalyzer::analyze(SourceUnit const& _sourceUnit)
|
||||||
{
|
{
|
||||||
_sourceUnit.accept(*this);
|
_sourceUnit.accept(*this);
|
||||||
@ -128,3 +130,22 @@ void StaticAnalyzer::warning(SourceLocation const& _location, string const& _des
|
|||||||
|
|
||||||
m_errors.push_back(err);
|
m_errors.push_back(err);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool StaticAnalyzer::visit(InlineAssembly const& _inlineAssembly)
|
||||||
|
{
|
||||||
|
if (!m_currentFunction)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
for (auto const& ref: _inlineAssembly.annotation().externalReferences)
|
||||||
|
{
|
||||||
|
if (auto var = dynamic_cast<VariableDeclaration const*>(ref.second.declaration))
|
||||||
|
{
|
||||||
|
solAssert(!var->name().empty(), "");
|
||||||
|
if (var->isLocalVariable())
|
||||||
|
m_localVarUseCount[var] += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@ -65,6 +65,7 @@ private:
|
|||||||
virtual bool visit(Identifier const& _identifier) override;
|
virtual bool visit(Identifier const& _identifier) override;
|
||||||
virtual bool visit(Return const& _return) override;
|
virtual bool visit(Return const& _return) override;
|
||||||
virtual bool visit(MemberAccess const& _memberAccess) override;
|
virtual bool visit(MemberAccess const& _memberAccess) override;
|
||||||
|
virtual bool visit(InlineAssembly const& _inlineAssembly) override;
|
||||||
|
|
||||||
ErrorList& m_errors;
|
ErrorList& m_errors;
|
||||||
|
|
||||||
|
@ -5718,6 +5718,20 @@ BOOST_AUTO_TEST_CASE(no_unused_dec_after_use)
|
|||||||
CHECK_SUCCESS_NO_WARNINGS(text);
|
CHECK_SUCCESS_NO_WARNINGS(text);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BOOST_AUTO_TEST_CASE(no_unused_inline_asm)
|
||||||
|
{
|
||||||
|
char const* text = R"(
|
||||||
|
contract C {
|
||||||
|
function f() {
|
||||||
|
uint a;
|
||||||
|
assembly {
|
||||||
|
a := 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)";
|
||||||
|
CHECK_SUCCESS_NO_WARNINGS(text);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user