Skip to content

Commit

Permalink
Use EVM version.
Browse files Browse the repository at this point in the history
  • Loading branch information
chriseth committed Feb 22, 2018
1 parent 5b63eb0 commit d938d19
Show file tree
Hide file tree
Showing 7 changed files with 24 additions and 10 deletions.
2 changes: 1 addition & 1 deletion libsolidity/analysis/TypeChecker.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1513,7 +1513,7 @@ bool TypeChecker::visit(FunctionCall const& _functionCall)
_functionCall.expression().annotation().isPure &&
functionType->isPure();

bool allowDynamicTypes = false; // @TODO this should be enabled if we use the current VM
bool allowDynamicTypes = m_evmVersion.hasReturndatacopy();
if (!functionType)
{
m_errorReporter.typeError(_functionCall.location(), "Type is not callable");
Expand Down
8 changes: 7 additions & 1 deletion libsolidity/analysis/TypeChecker.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@

#pragma once

#include <libsolidity/interface/EVMVersion.h>

#include <libsolidity/ast/Types.h>
#include <libsolidity/ast/ASTAnnotations.h>
#include <libsolidity/ast/ASTForward.h>
Expand All @@ -43,7 +45,10 @@ class TypeChecker: private ASTConstVisitor
{
public:
/// @param _errorReporter provides the error logging functionality.
TypeChecker(ErrorReporter& _errorReporter): m_errorReporter(_errorReporter) {}
TypeChecker(EVMVersion _evmVersion, ErrorReporter& _errorReporter):
m_evmVersion(_evmVersion),
m_errorReporter(_errorReporter)
{}

/// Performs type checking on the given contract and all of its sub-nodes.
/// @returns true iff all checks passed. Note even if all checks passed, errors() can still contain warnings
Expand Down Expand Up @@ -130,6 +135,7 @@ class TypeChecker: private ASTConstVisitor

ContractDefinition const* m_scope = nullptr;

EVMVersion m_evmVersion;
ErrorReporter& m_errorReporter;
};

Expand Down
2 changes: 1 addition & 1 deletion libsolidity/codegen/ExpressionCompiler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1608,7 +1608,7 @@ void ExpressionCompiler::appendExternalFunctionCall(
bool isCallCode = funKind == FunctionType::Kind::BareCallCode || funKind == FunctionType::Kind::CallCode;
bool isDelegateCall = funKind == FunctionType::Kind::BareDelegateCall || funKind == FunctionType::Kind::DelegateCall;

bool haveReturndatacopy = false; // @TODO change this to true if we are using the current VM
bool haveReturndatacopy = m_context.evmVersion().hasReturndatacopy();
unsigned retSize = 0;
TypePointers returnTypes;
if (returnSuccessCondition)
Expand Down
2 changes: 1 addition & 1 deletion libsolidity/interface/CompilerStack.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -198,7 +198,7 @@ bool CompilerStack::analyze()
m_contracts[contract->fullyQualifiedName()].contract = contract;
}

TypeChecker typeChecker(m_errorReporter);
TypeChecker typeChecker(m_evmVersion, m_errorReporter);
for (Source const* source: m_sourceOrder)
for (ASTPointer<ASTNode> const& node: source->ast->nodes())
if (ContractDefinition* contract = dynamic_cast<ContractDefinition*>(node.get()))
Expand Down
13 changes: 8 additions & 5 deletions test/libsolidity/Assembly.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -20,11 +20,9 @@
* Unit tests for Assembly Items from evmasm/Assembly.h
*/

#include <string>
#include <iostream>
#include <boost/test/unit_test.hpp>
#include <libevmasm/SourceLocation.h>
#include <libevmasm/Assembly.h>

#include <libsolidity/parsing/Scanner.h>
#include <libsolidity/parsing/Parser.h>
#include <libsolidity/analysis/NameAndTypeResolver.h>
Expand All @@ -33,6 +31,11 @@
#include <libsolidity/analysis/TypeChecker.h>
#include <libsolidity/interface/ErrorReporter.h>

#include <boost/test/unit_test.hpp>

#include <string>
#include <iostream>

using namespace std;
using namespace dev::eth;

Expand All @@ -46,7 +49,7 @@ namespace test
namespace
{

eth::AssemblyItems compileContract(const string& _sourceCode)
eth::AssemblyItems compileContract(string const& _sourceCode)
{
ErrorList errors;
ErrorReporter errorReporter(errors);
Expand All @@ -69,7 +72,7 @@ eth::AssemblyItems compileContract(const string& _sourceCode)
for (ASTPointer<ASTNode> const& node: sourceUnit->nodes())
if (ContractDefinition* contract = dynamic_cast<ContractDefinition*>(node.get()))
{
TypeChecker checker(errorReporter);
TypeChecker checker(EVMVersion{}, errorReporter);
BOOST_REQUIRE_NO_THROW(checker.checkTypeRequirements(*contract));
if (!Error::containsOnlyWarnings(errorReporter.errors()))
return AssemblyItems();
Expand Down
2 changes: 1 addition & 1 deletion test/libsolidity/SolidityExpressionCompiler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -132,7 +132,7 @@ bytes compileFirstExpression(
if (ContractDefinition* contract = dynamic_cast<ContractDefinition*>(node.get()))
{
ErrorReporter errorReporter(errors);
TypeChecker typeChecker(errorReporter);
TypeChecker typeChecker(EVMVersion{}, errorReporter);
BOOST_REQUIRE(typeChecker.checkTypeRequirements(*contract));
}
for (ASTPointer<ASTNode> const& node: sourceUnit->nodes())
Expand Down
5 changes: 5 additions & 0 deletions test/libsolidity/SolidityNameAndTypeResolution.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3117,6 +3117,11 @@ BOOST_AUTO_TEST_CASE(dynamic_return_types_not_possible)
}
}
)";
m_compiler.setEVMVersion(EVMVersion{});
CHECK_WARNING(sourceCode, "Use of the \"var\" keyword is deprecated");
m_compiler.setEVMVersion(*EVMVersion::fromString("byzantium"));
CHECK_WARNING(sourceCode, "Use of the \"var\" keyword is deprecated");
m_compiler.setEVMVersion(*EVMVersion::fromString("homestead"));
CHECK_ERROR(sourceCode, TypeError, "Explicit type conversion not allowed from \"inaccessible dynamic type\" to \"bytes storage pointer\".");
}

Expand Down

0 comments on commit d938d19

Please sign in to comment.