mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Merge pull request #10802 from ethereum/smt_fix_override
[SMTChecker] Fix static virtual resolution
This commit is contained in:
commit
51b7dc69b7
@ -2643,15 +2643,24 @@ pair<FunctionDefinition const*, ContractDefinition const*> SMTEncoder::functionC
|
|||||||
auto funDef = dynamic_cast<FunctionDefinition const*>(_ref->annotation().referencedDeclaration);
|
auto funDef = dynamic_cast<FunctionDefinition const*>(_ref->annotation().referencedDeclaration);
|
||||||
if (!funDef)
|
if (!funDef)
|
||||||
return {funDef, _contract};
|
return {funDef, _contract};
|
||||||
auto contextContract = _contract;
|
ContractDefinition const* contextContract = nullptr;
|
||||||
if (lookup == VirtualLookup::Virtual)
|
switch (lookup)
|
||||||
|
{
|
||||||
|
case VirtualLookup::Virtual:
|
||||||
funDef = &funDef->resolveVirtual(*_contract);
|
funDef = &funDef->resolveVirtual(*_contract);
|
||||||
else if (lookup == VirtualLookup::Super)
|
contextContract = _contract;
|
||||||
|
break;
|
||||||
|
case VirtualLookup::Super:
|
||||||
{
|
{
|
||||||
auto super = _contract->superContract(*_contract);
|
auto super = _contract->superContract(*_contract);
|
||||||
solAssert(super, "Super contract not available.");
|
solAssert(super, "Super contract not available.");
|
||||||
funDef = &funDef->resolveVirtual(*_contract, super);
|
funDef = &funDef->resolveVirtual(*_contract, super);
|
||||||
contextContract = super;
|
contextContract = super;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case VirtualLookup::Static:
|
||||||
|
contextContract = funDef->annotation().contract;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
return {funDef, contextContract};
|
return {funDef, contextContract};
|
||||||
};
|
};
|
||||||
|
@ -0,0 +1,21 @@
|
|||||||
|
pragma experimental SMTChecker;
|
||||||
|
contract BaseBase {
|
||||||
|
uint x;
|
||||||
|
function init(uint a, uint b) public virtual {
|
||||||
|
x = a;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
contract Base is BaseBase {
|
||||||
|
function init(uint a, uint b) public override {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
contract Child is Base {
|
||||||
|
function bInit(uint c, uint d) public {
|
||||||
|
BaseBase.init(c, d);
|
||||||
|
assert(x == c);
|
||||||
|
assert(x == d); // should fail
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// ----
|
||||||
|
// Warning 5667: (84-90): Unused function parameter. Remove or comment out the variable name to silence this warning.
|
||||||
|
// Warning 6328: (314-328): CHC: Assertion violation happens here.\nCounterexample:\nx = 0\nc = 0\nd = 1\n\nTransaction trace:\nChild.constructor()\nState: x = 0\nChild.bInit(0, 1)\n BaseBase.init(0, 1) -- internal call
|
Loading…
Reference in New Issue
Block a user