¿Problema del compilador o declaración de variable de estado incorrecta?

Después de ver algunos resultados inesperados del compilador, reduje el problema a este pequeño ejemplo:

Lo siguiente se compila bajo 0.4.10 en Remix:

contract StorageMapping {

    struct S {
        mapping(bytes32 => uint) m;
        bytes32[] b;
        uint x;
    }

    mapping(bytes32 => S) public sStructs;

}

Sin embargo, lo siguiente no se puede compilar con " El tipo interno no está permitido para la variable de estado, en referencia a la asignación. Comprobación puntual de 3.x y 2.x. El resultado es coherente con la versión 0.2.1 (0.2.0 arroja un error interno del compilador ).

La única diferencia en los contratos es la única línea comentada.

contract StorageMapping {

    struct S {
        mapping(bytes32 => uint) m;
        bytes32[] b;
        // uint x;
    }

    mapping(bytes32 => S) public sStructs;

}

Lo importante parece ser agregar un valor simple a la estructura (incluso si no es necesario). Esto me hace preguntarme qué está pasando realmente.

¿Alguien sabe una razón por la cual la estructura mapeada parece necesitar al menos un valor simple para evitar confusiones ?

Respuestas (1)

Gracias a chriseth por señalar que no es posible ensamblar un getter para sStructs cuando las estructuras contienen solo tipos indexados. Dado que se declara public, el compilador no está contento con que se le pida que cree un getter imposible.

Eliminar publicy ambos sabores y compilar.