From 7b8279966e4b5357ae46ca4d8697f6c68d79570c Mon Sep 17 00:00:00 2001 From: Alexander Arlt Date: Tue, 27 Jul 2021 09:32:34 -0500 Subject: [PATCH] Add minimal support for fixed-point types in assembly. --- libsolidity/analysis/TypeChecker.cpp | 2 -- libsolidity/codegen/YulUtilFunctions.cpp | 2 +- .../semanticTests/fixedPoint/inline_assembly.sol | 10 ++++++++++ 3 files changed, 11 insertions(+), 3 deletions(-) create mode 100644 test/libsolidity/semanticTests/fixedPoint/inline_assembly.sol diff --git a/libsolidity/analysis/TypeChecker.cpp b/libsolidity/analysis/TypeChecker.cpp index 0c90d005c..1ca8dd193 100644 --- a/libsolidity/analysis/TypeChecker.cpp +++ b/libsolidity/analysis/TypeChecker.cpp @@ -806,8 +806,6 @@ bool TypeChecker::visit(InlineAssembly const& _inlineAssembly) } } - solAssert(!dynamic_cast(var->type()), "FixedPointType not implemented."); - if (!identifierInfo.suffix.empty()) { string const& suffix = identifierInfo.suffix; diff --git a/libsolidity/codegen/YulUtilFunctions.cpp b/libsolidity/codegen/YulUtilFunctions.cpp index bd86dc9c2..ecf3c31c0 100644 --- a/libsolidity/codegen/YulUtilFunctions.cpp +++ b/libsolidity/codegen/YulUtilFunctions.cpp @@ -3741,7 +3741,7 @@ string YulUtilFunctions::cleanupFunction(Type const& _type) templ("body", "cleaned := iszero(iszero(value))"); break; case Type::Category::FixedPoint: - solUnimplemented("Fixed point types not implemented."); + templ("body", "cleaned := " + cleanupFunction(*dynamic_cast(_type).asIntegerType()) + "(value)"); break; case Type::Category::Function: switch (dynamic_cast(_type).kind()) diff --git a/test/libsolidity/semanticTests/fixedPoint/inline_assembly.sol b/test/libsolidity/semanticTests/fixedPoint/inline_assembly.sol new file mode 100644 index 000000000..48a6bf8d0 --- /dev/null +++ b/test/libsolidity/semanticTests/fixedPoint/inline_assembly.sol @@ -0,0 +1,10 @@ +contract A { + function f() public pure returns (fixed x) { + assembly { x := 1000 } + } +} +// ==== +// compileToEwasm: also +// compileViaYul: also +// ---- +// f() -> 1000