diff --git a/libsolidity/codegen/ir/IRGeneratorForStatements.cpp b/libsolidity/codegen/ir/IRGeneratorForStatements.cpp index 5902cfef68b6..4b4bd6cc22fc 100644 --- a/libsolidity/codegen/ir/IRGeneratorForStatements.cpp +++ b/libsolidity/codegen/ir/IRGeneratorForStatements.cpp @@ -2910,9 +2910,11 @@ void IRGeneratorForStatements::assignInternalFunctionIDIfNotCalledDirectly( if (_expression.annotation().calledDirectly) return; - define(IRVariable(_expression).part("functionIdentifier")) << - std::to_string(m_context.mostDerivedContract().annotation().internalFunctionIDs.at(&_referencedFunction)) << - "\n"; + auto const it = m_context.mostDerivedContract().annotation().internalFunctionIDs.find(&_referencedFunction); + if (it == m_context.mostDerivedContract().annotation().internalFunctionIDs.end()) + return; + + define(IRVariable(_expression).part("functionIdentifier")) << std::to_string(it->second) << '\n'; m_context.addToInternalDispatch(_referencedFunction); } diff --git a/test/libsolidity/semanticTests/functionSelector/function_selector_as_constant.sol b/test/libsolidity/semanticTests/functionSelector/function_selector_as_constant.sol new file mode 100644 index 000000000000..9aff346400d8 --- /dev/null +++ b/test/libsolidity/semanticTests/functionSelector/function_selector_as_constant.sol @@ -0,0 +1,11 @@ +contract B { + function g() public {} +} + +contract C is B { + bytes4 public constant s2 = B.g.selector; +} + + +// ---- +// s2() -> 0xe2179b8e00000000000000000000000000000000000000000000000000000000