From c547bd22b5ce31d89f4ffd15cded8cae2b1f9533 Mon Sep 17 00:00:00 2001 From: rodiazet Date: Thu, 23 Jan 2025 17:47:23 +0100 Subject: [PATCH] eof: Fix condition when generating custom error for builtins available in EOF but not in legacy --- libyul/AsmAnalysis.cpp | 7 ++++--- .../eof/eof_identifiers_not_defined_in_legacy.yul | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/libyul/AsmAnalysis.cpp b/libyul/AsmAnalysis.cpp index 69f2e765e0b9..b1c771c6593b 100644 --- a/libyul/AsmAnalysis.cpp +++ b/libyul/AsmAnalysis.cpp @@ -690,21 +690,22 @@ void AsmAnalyzer::expectValidIdentifier(YulName _identifier, SourceLocation cons bool AsmAnalyzer::validateInstructions(std::string_view _instructionIdentifier, langutil::SourceLocation const& _location) { // NOTE: This function uses the default EVM version instead of the currently selected one. - auto const& defaultEVMDialect = EVMDialect::strictAssemblyForEVM(EVMVersion{}, std::nullopt); + auto const& defaultEVMDialect = EVMDialect::strictAssemblyForEVMObjects(EVMVersion{}, std::nullopt); auto const builtinHandle = defaultEVMDialect.findBuiltin(_instructionIdentifier); if (builtinHandle && defaultEVMDialect.builtin(*builtinHandle).instruction.has_value()) return validateInstructions(*defaultEVMDialect.builtin(*builtinHandle).instruction, _location); solAssert(!m_eofVersion.has_value() || (*m_eofVersion == 1 && m_evmVersion == langutil::EVMVersion::prague())); // TODO: Change `prague()` to `EVMVersion{}` once EOF gets deployed - auto const& eofDialect = EVMDialect::strictAssemblyForEVM(EVMVersion::prague(), 1); + auto const& eofDialect = EVMDialect::strictAssemblyForEVMObjects(EVMVersion::prague(), 1); auto const eofBuiltinHandle = eofDialect.findBuiltin(_instructionIdentifier); if (eofBuiltinHandle) { auto const builtin = eofDialect.builtin(*eofBuiltinHandle); if (builtin.instruction.has_value()) return validateInstructions(*builtin.instruction, _location); - else if (!m_eofVersion.has_value()) + // If builtin is avavailable in EOF but not available in legacy (and we build to legacy) generate custom error. + else if (!m_eofVersion.has_value() && !builtinHandle) { m_errorReporter.declarationError( 7223_error, diff --git a/test/libyul/yulSyntaxTests/eof/eof_identifiers_not_defined_in_legacy.yul b/test/libyul/yulSyntaxTests/eof/eof_identifiers_not_defined_in_legacy.yul index ab55fb21d786..0b786893ec06 100644 --- a/test/libyul/yulSyntaxTests/eof/eof_identifiers_not_defined_in_legacy.yul +++ b/test/libyul/yulSyntaxTests/eof/eof_identifiers_not_defined_in_legacy.yul @@ -18,7 +18,7 @@ // DeclarationError 7223: (6-18): Builtin function "auxdataloadn" is only available in EOF. // DeclarationError 4619: (26-35): Function "dataloadn" not found. // DeclarationError 7223: (43-52): Builtin function "eofcreate" is only available in EOF. -// DeclarationError 4619: (77-91): Function "returncontract" not found. +// DeclarationError 7223: (77-91): Builtin function "returncontract" is only available in EOF. // DeclarationError 4619: (110-115): Function "rjump" not found. // DeclarationError 4619: (122-128): Function "rjumpi" not found. // DeclarationError 4619: (135-140): Function "callf" not found.