aboutsummaryrefslogtreecommitdiffstats
path: root/libyul/AsmAnalysis.cpp
diff options
context:
space:
mode:
authorchriseth <chris@ethereum.org>2018-12-21 00:22:17 +0800
committerchriseth <chris@ethereum.org>2019-01-08 00:23:38 +0800
commit5b73c2ae3bce09442572b5401a7bcccc2ffe7590 (patch)
treed2e5b07ef78f240b3b8d1ae72cfae4054ce6e41e /libyul/AsmAnalysis.cpp
parent9f5d34af7de481c5b8ce89057a6df2a3283d14b0 (diff)
downloaddexon-solidity-5b73c2ae3bce09442572b5401a7bcccc2ffe7590.tar.gz
dexon-solidity-5b73c2ae3bce09442572b5401a7bcccc2ffe7590.tar.zst
dexon-solidity-5b73c2ae3bce09442572b5401a7bcccc2ffe7590.zip
Take special functions that require literals into account.
Diffstat (limited to 'libyul/AsmAnalysis.cpp')
-rw-r--r--libyul/AsmAnalysis.cpp10
1 files changed, 10 insertions, 0 deletions
diff --git a/libyul/AsmAnalysis.cpp b/libyul/AsmAnalysis.cpp
index 0ecc5a30..6a7b2b61 100644
--- a/libyul/AsmAnalysis.cpp
+++ b/libyul/AsmAnalysis.cpp
@@ -299,11 +299,14 @@ bool AsmAnalyzer::operator()(FunctionCall const& _funCall)
bool success = true;
size_t parameters = 0;
size_t returns = 0;
+ bool needsLiteralArguments = false;
if (BuiltinFunction const* f = m_dialect->builtin(_funCall.functionName.name))
{
// TODO: compare types, too
parameters = f->parameters.size();
returns = f->returns.size();
+ if (f->literalArguments)
+ needsLiteralArguments = true;
}
else if (!m_currentScope->lookup(_funCall.functionName.name, Scope::Visitor(
[&](Scope::Variable const&)
@@ -347,8 +350,15 @@ bool AsmAnalyzer::operator()(FunctionCall const& _funCall)
}
for (auto const& arg: _funCall.arguments | boost::adaptors::reversed)
+ {
if (!expectExpression(arg))
success = false;
+ else if (needsLiteralArguments && arg.type() != typeid(Literal))
+ m_errorReporter.typeError(
+ _funCall.functionName.location,
+ "Function expects direct literals as arguments."
+ );
+ }
// Use argument size instead of parameter count to avoid misleading errors.
m_stackHeight += int(returns) - int(_funCall.arguments.size());
m_info.stackHeightInfo[&_funCall] = m_stackHeight;