From d3739fe62067fb715651ec5cd4c797a8e888e3c5 Mon Sep 17 00:00:00 2001 From: chriseth Date: Tue, 4 Feb 2020 18:12:22 +0100 Subject: [PATCH] Fix WordSizeTransform to properly assign default types. --- libyul/backends/wasm/WordSizeTransform.cpp | 27 ++++++++++++---------- 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/libyul/backends/wasm/WordSizeTransform.cpp b/libyul/backends/wasm/WordSizeTransform.cpp index 3aac84870..9ebf31738 100644 --- a/libyul/backends/wasm/WordSizeTransform.cpp +++ b/libyul/backends/wasm/WordSizeTransform.cpp @@ -43,7 +43,11 @@ void WordSizeTransform::operator()(FunctionCall& _fc) { if (BuiltinFunction const* fun = m_inputDialect.builtin(_fc.functionName.name)) if (fun->literalArguments) + { + for (Expression& arg: _fc.arguments) + get(arg).type = m_defaultType; return; + } rewriteFunctionCallArguments(_fc.arguments); } @@ -85,8 +89,13 @@ void WordSizeTransform::operator()(Block& _block) { VariableDeclaration& varDecl = std::get(_s); - // Special handling for datasize and dataoffset - they will only need one variable. - if (varDecl.value && holds_alternative(*varDecl.value)) + if (!varDecl.value) + rewriteVarDeclList(varDecl.variables); + else if (holds_alternative(*varDecl.value)) + { + visit(*varDecl.value); + + // Special handling for datasize and dataoffset - they will only need one variable. if (BuiltinFunction const* f = m_inputDialect.builtin(std::get(*varDecl.value).functionName.name)) if (f->literalArguments) { @@ -108,12 +117,6 @@ void WordSizeTransform::operator()(Block& _block) return {std::move(ret)}; } - if ( - !varDecl.value || - holds_alternative(*varDecl.value) - ) - { - if (varDecl.value) visit(*varDecl.value); rewriteVarDeclList(varDecl.variables); return std::nullopt; } @@ -144,8 +147,11 @@ void WordSizeTransform::operator()(Block& _block) Assignment& assignment = std::get(_s); yulAssert(assignment.value, ""); - // Special handling for datasize and dataoffset - they will only need one variable. if (holds_alternative(*assignment.value)) + { + visit(*assignment.value); + + // Special handling for datasize and dataoffset - they will only need one variable. if (BuiltinFunction const* f = m_inputDialect.builtin(std::get(*assignment.value).functionName.name)) if (f->literalArguments) { @@ -167,9 +173,6 @@ void WordSizeTransform::operator()(Block& _block) return {std::move(ret)}; } - if (holds_alternative(*assignment.value)) - { - if (assignment.value) visit(*assignment.value); rewriteIdentifierList(assignment.variableNames); return std::nullopt; }