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