mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Fix ICE caused by an immutable struct
This commit is contained in:
parent
3948391ca8
commit
423f3d3088
@ -13,6 +13,7 @@ Compiler Features:
|
|||||||
Bugfixes:
|
Bugfixes:
|
||||||
* ABI Encoder: When encoding an empty string coming from storage do not add a superfluous empty slot for data.
|
* ABI Encoder: When encoding an empty string coming from storage do not add a superfluous empty slot for data.
|
||||||
* Yul Optimizer: Do not remove ``returndatacopy`` in cases in which it might perform out-of-bounds reads that unconditionally revert as out-of-gas. Previously, any ``returndatacopy`` that wrote to memory that was never read from was removed without accounting for the out-of-bounds condition.
|
* Yul Optimizer: Do not remove ``returndatacopy`` in cases in which it might perform out-of-bounds reads that unconditionally revert as out-of-gas. Previously, any ``returndatacopy`` that wrote to memory that was never read from was removed without accounting for the out-of-bounds condition.
|
||||||
|
* DocString Parser: Fix ICE caused by an immutable struct with mapping.
|
||||||
|
|
||||||
|
|
||||||
### 0.8.14 (2022-05-17)
|
### 0.8.14 (2022-05-17)
|
||||||
|
@ -479,12 +479,6 @@ bool CompilerStack::analyze()
|
|||||||
if (auto sourceAst = source->ast)
|
if (auto sourceAst = source->ast)
|
||||||
noErrors = contractLevelChecker.check(*sourceAst);
|
noErrors = contractLevelChecker.check(*sourceAst);
|
||||||
|
|
||||||
// Requires ContractLevelChecker
|
|
||||||
DocStringAnalyser docStringAnalyser(m_errorReporter);
|
|
||||||
for (Source const* source: m_sourceOrder)
|
|
||||||
if (source->ast && !docStringAnalyser.analyseDocStrings(*source->ast))
|
|
||||||
noErrors = false;
|
|
||||||
|
|
||||||
// Now we run full type checks that go down to the expression level. This
|
// Now we run full type checks that go down to the expression level. This
|
||||||
// cannot be done earlier, because we need cross-contract types and information
|
// cannot be done earlier, because we need cross-contract types and information
|
||||||
// about whether a contract is abstract for the `new` expression.
|
// about whether a contract is abstract for the `new` expression.
|
||||||
@ -497,6 +491,15 @@ bool CompilerStack::analyze()
|
|||||||
if (source->ast && !typeChecker.checkTypeRequirements(*source->ast))
|
if (source->ast && !typeChecker.checkTypeRequirements(*source->ast))
|
||||||
noErrors = false;
|
noErrors = false;
|
||||||
|
|
||||||
|
if (noErrors)
|
||||||
|
{
|
||||||
|
// Requires ContractLevelChecker and TypeChecker
|
||||||
|
DocStringAnalyser docStringAnalyser(m_errorReporter);
|
||||||
|
for (Source const* source: m_sourceOrder)
|
||||||
|
if (source->ast && !docStringAnalyser.analyseDocStrings(*source->ast))
|
||||||
|
noErrors = false;
|
||||||
|
}
|
||||||
|
|
||||||
if (noErrors)
|
if (noErrors)
|
||||||
{
|
{
|
||||||
// Checks that can only be done when all types of all AST nodes are known.
|
// Checks that can only be done when all types of all AST nodes are known.
|
||||||
|
@ -0,0 +1,9 @@
|
|||||||
|
contract Contract {
|
||||||
|
struct S {
|
||||||
|
int k;
|
||||||
|
}
|
||||||
|
|
||||||
|
S immutable s;
|
||||||
|
}
|
||||||
|
// ----
|
||||||
|
// TypeError 6377: (61-74): Immutable variables cannot have a non-value type.
|
@ -0,0 +1,9 @@
|
|||||||
|
contract Contract {
|
||||||
|
struct S {
|
||||||
|
mapping(uint => address) map;
|
||||||
|
}
|
||||||
|
|
||||||
|
S immutable s;
|
||||||
|
}
|
||||||
|
// ----
|
||||||
|
// TypeError 6377: (84-97): Immutable variables cannot have a non-value type.
|
Loading…
Reference in New Issue
Block a user