diff --git a/libsolidity/codegen/YulUtilFunctions.cpp b/libsolidity/codegen/YulUtilFunctions.cpp index 8abc2385f..ea3fec01b 100644 --- a/libsolidity/codegen/YulUtilFunctions.cpp +++ b/libsolidity/codegen/YulUtilFunctions.cpp @@ -2353,8 +2353,6 @@ string YulUtilFunctions::copyArrayFromStorageToMemoryFunction(ArrayType const& _ string YulUtilFunctions::mappingIndexAccessFunction(MappingType const& _mappingType, Type const& _keyType) { - solAssert(_keyType.sizeOnStack() <= 1, ""); - string functionName = "mapping_index_access_" + _mappingType.identifier() + "_of_" + _keyType.identifier(); return m_functionCollector.createFunction(functionName, [&]() { if (_mappingType.keyType()->isDynamicallySized()) @@ -2364,7 +2362,7 @@ string YulUtilFunctions::mappingIndexAccessFunction(MappingType const& _mappingT } )") ("functionName", functionName) - ("key", _keyType.sizeOnStack() > 0 ? "key" : "") + ("key", suffixedVariableNameList("key_", 0, _keyType.sizeOnStack())) ("hash", packedHashFunction( {&_keyType, TypeProvider::uint256()}, {_mappingType.keyType(), TypeProvider::uint256()} diff --git a/libsolidity/codegen/ir/IRGeneratorForStatements.cpp b/libsolidity/codegen/ir/IRGeneratorForStatements.cpp index 691724e1b..c2a54a838 100644 --- a/libsolidity/codegen/ir/IRGeneratorForStatements.cpp +++ b/libsolidity/codegen/ir/IRGeneratorForStatements.cpp @@ -2062,7 +2062,6 @@ void IRGeneratorForStatements::endVisit(IndexAccess const& _indexAccess) MappingType const& mappingType = dynamic_cast(baseType); Type const& keyType = *_indexAccess.indexExpression()->annotation().type; - solAssert(keyType.sizeOnStack() <= 1, ""); string slot = m_context.newYulVariable(); Whiskers templ("let := (,)\n"); diff --git a/test/libsolidity/semanticTests/storage/mapping_string_key.sol b/test/libsolidity/semanticTests/storage/mapping_string_key.sol new file mode 100644 index 000000000..84ac9b09a --- /dev/null +++ b/test/libsolidity/semanticTests/storage/mapping_string_key.sol @@ -0,0 +1,24 @@ +contract C { + mapping (string => uint) m_nameToRecord; + function set(string calldata key, uint value) external { + m_nameToRecord[key] = value; + } + function get(string calldata key) external view returns (uint) { + return m_nameToRecord[key]; + } + function setFixed(uint value) external { + m_nameToRecord["fixed"] = value; + } + function getFixed() external view returns (uint) { + return m_nameToRecord["fixed"]; + } +} +// ==== +// compileViaYul: also +// ---- +// set(string,uint256): 0x40, 8, 3, "abc" -> +// get(string): 0x20, 3, "abc" -> 8 +// get(string): 0x20, 3, "abe" -> 0 +// getFixed() -> 0 +// setFixed(uint256): 9 -> +// getFixed() -> 9