This commit is contained in:
Emilio Almansi 2023-09-08 06:50:30 +08:00 committed by GitHub
commit 131018a432
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 53 additions and 0 deletions

View File

@ -57,6 +57,7 @@ Bugfixes:
* Yul Optimizer: Ensure that the assignment of memory slots for variables moved to memory does not depend on AST IDs that may depend on whether additional files are included during compilation.
* Yul Optimizer: Fix ``FullInliner`` step not ignoring code that is not in expression-split form.
* Yul Optimizer: Fix optimized IR being unnecessarily passed through the Yul optimizer again before bytecode generation.
* TypeChecker: Fix non-constant event and error selectors.
AST Changes:

View File

@ -3357,6 +3357,29 @@ bool TypeChecker::visit(MemberAccess const& _memberAccess)
annotation.isPure = isPure;
}
if (
auto const* functionType = dynamic_cast<FunctionType const*>(exprType);
!annotation.isPure.set() &&
functionType &&
functionType->kind() == FunctionType::Kind::Event &&
functionType->hasDeclaration() &&
memberName == "selector"
)
if (
auto const* eventDefinition = dynamic_cast<EventDefinition const*>(&functionType->declaration());
eventDefinition &&
!eventDefinition->isAnonymous()
)
annotation.isPure = true;
if (
auto const* functionType = dynamic_cast<FunctionType const*>(exprType);
!annotation.isPure.set() &&
functionType &&
functionType->kind() == FunctionType::Kind::Error &&
functionType->hasDeclaration() &&
memberName == "selector"
)
annotation.isPure = true;
if (
auto const* varDecl = dynamic_cast<VariableDeclaration const*>(annotation.referencedDeclaration);
!annotation.isPure.set() &&

View File

@ -0,0 +1,10 @@
interface I {
error Er1();
}
contract C {
function f() external {}
error Er2();
bytes4 constant errorSelector1 = I.Er1.selector;
bytes4 constant errorSelector2 = Er2.selector;
}
// ----

View File

@ -0,0 +1,10 @@
interface I {
event Ev1();
}
contract C {
function f() external {}
event Ev2();
bytes32 constant eventSelector1 = I.Ev1.selector;
bytes32 constant eventSelector2 = Ev2.selector;
}
// ----

View File

@ -0,0 +1,9 @@
interface I {
function f() external;
}
contract C {
function f() external {}
bytes4 constant functionSelector1 = I.f.selector;
bytes4 constant functionSelector2 = this.f.selector;
}
// ----