Skip to content

Commit 1b0edfe

Browse files
authored
Merge pull request #15638 from ipsilon/eof-gas-option-disallow
eof: Disallow `gas` option for external function call.
2 parents 934d8b0 + 3a290de commit 1b0edfe

File tree

6 files changed

+32
-4
lines changed

6 files changed

+32
-4
lines changed

libsolidity/analysis/TypeChecker.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2967,6 +2967,12 @@ bool TypeChecker::visit(FunctionCallOptions const& _functionCallOptions)
29672967
_functionCallOptions.location(),
29682968
"Function call option \"gas\" cannot be used with \"new\"."
29692969
);
2970+
else if (m_eofVersion.has_value())
2971+
m_errorReporter.typeError(
2972+
3765_error,
2973+
_functionCallOptions.location(),
2974+
"Function call option \"gas\" cannot be used when compiling to EOF."
2975+
);
29702976
else
29712977
{
29722978
expectType(*_functionCallOptions.options()[i], *TypeProvider::uint256());

libsolidity/analysis/TypeChecker.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,9 @@ class TypeChecker: private ASTConstVisitor
4747
{
4848
public:
4949
/// @param _errorReporter provides the error logging functionality.
50-
TypeChecker(langutil::EVMVersion _evmVersion, langutil::ErrorReporter& _errorReporter):
50+
TypeChecker(langutil::EVMVersion _evmVersion, std::optional<uint8_t> _eofVersion, langutil::ErrorReporter& _errorReporter):
5151
m_evmVersion(_evmVersion),
52+
m_eofVersion(_eofVersion),
5253
m_errorReporter(_errorReporter)
5354
{}
5455

@@ -192,6 +193,7 @@ class TypeChecker: private ASTConstVisitor
192193
ContractDefinition const* m_currentContract = nullptr;
193194

194195
langutil::EVMVersion m_evmVersion;
196+
std::optional<uint8_t> m_eofVersion;
195197

196198
langutil::ErrorReporter& m_errorReporter;
197199
};

libsolidity/interface/CompilerStack.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -557,7 +557,7 @@ bool CompilerStack::analyzeLegacy(bool _noErrorsSoFar)
557557
//
558558
// Note: this does not resolve overloaded functions. In order to do that, types of arguments are needed,
559559
// which is only done one step later.
560-
TypeChecker typeChecker(m_evmVersion, m_errorReporter);
560+
TypeChecker typeChecker(m_evmVersion, m_eofVersion, m_errorReporter);
561561
for (Source const* source: m_sourceOrder)
562562
if (source->ast && !typeChecker.checkTypeRequirements(*source->ast))
563563
noErrors = false;

test/libsolidity/Assembly.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,11 @@ evmasm::AssemblyItems compileContract(std::shared_ptr<CharStream> _sourceCode)
8181
if (Error::containsErrors(errorReporter.errors()))
8282
return AssemblyItems();
8383
}
84-
TypeChecker checker(solidity::test::CommonOptions::get().evmVersion(), errorReporter);
84+
TypeChecker checker(
85+
solidity::test::CommonOptions::get().evmVersion(),
86+
solidity::test::CommonOptions::get().eofVersion(),
87+
errorReporter
88+
);
8589
BOOST_REQUIRE_NO_THROW(checker.checkTypeRequirements(*sourceUnit));
8690
if (Error::containsErrors(errorReporter.errors()))
8791
return AssemblyItems();

test/libsolidity/SolidityExpressionCompiler.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,11 @@ bytes compileFirstExpression(
133133
DeclarationTypeChecker declarationTypeChecker(errorReporter, solidity::test::CommonOptions::get().evmVersion());
134134
for (ASTPointer<ASTNode> const& node: sourceUnit->nodes())
135135
BOOST_REQUIRE(declarationTypeChecker.check(*node));
136-
TypeChecker typeChecker(solidity::test::CommonOptions::get().evmVersion(), errorReporter);
136+
TypeChecker typeChecker(
137+
solidity::test::CommonOptions::get().evmVersion(),
138+
solidity::test::CommonOptions::get().eofVersion(),
139+
errorReporter
140+
);
137141
BOOST_REQUIRE(typeChecker.checkTypeRequirements(*sourceUnit));
138142
for (ASTPointer<ASTNode> const& node: sourceUnit->nodes())
139143
if (ContractDefinition* contract = dynamic_cast<ContractDefinition*>(node.get()))
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
contract C {
2+
function g(bool x) public pure {
3+
require(x);
4+
}
5+
function f(bool x) public returns (uint) {
6+
this.g{gas: 8000}(x);
7+
}
8+
}
9+
// ====
10+
// bytecodeFormat: >=EOFv1
11+
// ----
12+
// TypeError 3765: (131-148): Function call option "gas" cannot be used when compiling to EOF.

0 commit comments

Comments
 (0)