Why the error: "InternalCompilerError: Static memory load of more than 32 bytes requested"?

Why the error: "InternalCompilerError: Static memory load of more than 32 bytes requested"?

使用 Remix (https://remix.ethereum.org/) 并使用结构。编译器是 0.4.19+commit.c4cbbb05。 "Optimization" 未选中。

pragma solidity ^0.4.4;

contract Test {
    struct FooBar {
        uint8 foo;
        uint16 bar;
    }

    FooBar public fooBar;

    function getFooBar() public view returns(FooBar) {
        return fooBar;
    }

    function setFooBar(FooBar value) public {
        fooBar = value;
    }
}

显示错误:"InternalCompilerError: Static memory load of more than 32 bytes requested."

不知道为什么。在我看来,结构 FooBar 只有 3 个字节大。我的两个函数 reads/writes 一个 FooBar。我在这里错过了什么?

更新

稍微重构一下代码,使其更清晰:

pragma solidity ^0.4.4;

contract Test {
    struct FooBar {
        uint8 foo;
        uint16 bar;
    }

    FooBar public fooBar;

    // InternalCompilerError: Static memory load of more than 32 bytes requested.
    function setFooBar1(FooBar value) public {
        fooBar = value;
    }

    // No such error.
    function setFooBar2(uint8 foo, uint16 bar) public {
        fooBar.foo = foo;
        fooBar.bar = bar;
    }
}

显然直接传递结构会导致编译错误,而传递单个字段则不会。想知道有什么区别。

这似乎是一个 solidity 错误 - 请参阅:

https://github.com/ethereum/solidity/issues/3361

和:

https://github.com/ethereum/solidity/issues/3069

现在还有以太坊的 Stack Exchange:

https://ethereum.stackexchange.com/