diff --git a/libsolidity/analysis/SyntaxChecker.cpp b/libsolidity/analysis/SyntaxChecker.cpp index 1e3f5f1c2a56..b2d4fc3e3930 100644 --- a/libsolidity/analysis/SyntaxChecker.cpp +++ b/libsolidity/analysis/SyntaxChecker.cpp @@ -83,6 +83,12 @@ bool SyntaxChecker::visit(PragmaDirective const& _pragma) else if (_pragma.literals()[0] == "experimental") { solAssert(m_sourceUnit, ""); + if (!m_experimental) + m_errorReporter.syntaxError( + 2816_error, + _pragma.location(), + "Experimental pragmas can only be used if the experimental mode has been enabled." + ); std::vector literals(_pragma.literals().begin() + 1, _pragma.literals().end()); if (literals.empty()) m_errorReporter.syntaxError( diff --git a/libsolidity/analysis/SyntaxChecker.h b/libsolidity/analysis/SyntaxChecker.h index 69bda229f701..9babfe47e418 100644 --- a/libsolidity/analysis/SyntaxChecker.h +++ b/libsolidity/analysis/SyntaxChecker.h @@ -45,9 +45,12 @@ class SyntaxChecker: private ASTConstVisitor { public: /// @param _errorReporter provides the error logging functionality. - SyntaxChecker(langutil::ErrorReporter& _errorReporter, bool _useYulOptimizer): + /// @param _useYulOptimizer indicates whether Yul optimizer is enabled. + /// @param _experimental indicates whether the experimental toggle (option) is enabled. + SyntaxChecker(langutil::ErrorReporter& _errorReporter, bool _useYulOptimizer, bool _experimental): m_errorReporter(_errorReporter), - m_useYulOptimizer(_useYulOptimizer) + m_useYulOptimizer(_useYulOptimizer), + m_experimental(_experimental) {} bool checkSyntax(ASTNode const& _astRoot); @@ -112,6 +115,9 @@ class SyntaxChecker: private ASTConstVisitor /// Flag that indicates whether we are inside an unchecked block. bool m_uncheckedArithmetic = false; + /// Flag that indicates whether experimental mode is toggled. + bool m_experimental = false; + int m_inLoopDepth = 0; std::optional m_currentContractKind; diff --git a/libsolidity/interface/CompilerStack.cpp b/libsolidity/interface/CompilerStack.cpp index 975ed3c1982d..2d188fda4ea6 100644 --- a/libsolidity/interface/CompilerStack.cpp +++ b/libsolidity/interface/CompilerStack.cpp @@ -229,6 +229,12 @@ void CompilerStack::setViaIR(bool _viaIR) m_viaIR = _viaIR; } +void CompilerStack::setExperimental(bool _experimental) +{ + solAssert(m_stackState < ParsedAndImported, "Must set experimental before parsing."); + m_experimental = _experimental; +} + void CompilerStack::setEVMVersion(langutil::EVMVersion _version) { solAssert(m_stackState < ParsedAndImported, "Must set EVM version before parsing."); @@ -467,7 +473,7 @@ bool CompilerStack::analyze() { bool experimentalSolidity = isExperimentalSolidity(); - SyntaxChecker syntaxChecker(m_errorReporter, m_optimiserSettings.runYulOptimiser); + SyntaxChecker syntaxChecker(m_errorReporter, m_optimiserSettings.runYulOptimiser, m_experimental); for (Source const* source: m_sourceOrder) if (source->ast && !syntaxChecker.checkSyntax(*source->ast)) noErrors = false; diff --git a/libsolidity/interface/CompilerStack.h b/libsolidity/interface/CompilerStack.h index 2731787a4b88..eb765d3c666b 100644 --- a/libsolidity/interface/CompilerStack.h +++ b/libsolidity/interface/CompilerStack.h @@ -223,6 +223,9 @@ class CompilerStack: public langutil::CharStreamProvider, public evmasm::Abstrac /// Must be set before parsing. void setViaIR(bool _viaIR); + /// Sets the experimental toggle to allow usage of experimental features. + void setExperimental(bool _experimental); + /// Set the EVM version used before running compile. /// When called without an argument it will revert to the default version. /// Must be set before parsing. @@ -607,6 +610,7 @@ class CompilerStack: public langutil::CharStreamProvider, public evmasm::Abstrac RevertStrings m_revertStrings = RevertStrings::Default; State m_stopAfter = State::CompilationSuccessful; bool m_viaIR = false; + bool m_experimental = false; langutil::EVMVersion m_evmVersion; std::optional m_eofVersion; ModelCheckerSettings m_modelCheckerSettings; diff --git a/scripts/ASTImportTest.sh b/scripts/ASTImportTest.sh index c7f504087c96..370aab9bd6f2 100755 --- a/scripts/ASTImportTest.sh +++ b/scripts/ASTImportTest.sh @@ -117,7 +117,7 @@ function test_ast_import_export_equivalence local input_files=( "${@:2}" ) local export_command=("$SOLC" --combined-json ast --pretty-json --json-indent 4 "${input_files[@]}") - local import_command=("$SOLC" --import-ast --combined-json ast --pretty-json --json-indent 4 expected.json) + local import_command=("$SOLC" --experimental --import-ast --combined-json ast --pretty-json --json-indent 4 expected.json) local import_via_standard_json_command=("$SOLC" --combined-json ast --pretty-json --json-indent 4 --standard-json standard_json_input.json) # export ast - save ast json as expected result (silently) @@ -228,7 +228,7 @@ function test_evmjson_import_export_equivalence local bin_file_from_asm_import bin_file_from_asm_import="import/$(basename "${asm_json_file}" .json).bin" - local import_options=(--bin --import-asm-json "${asm_json_file}") + local import_options=(--experimental --bin --import-asm-json "${asm_json_file}") run_solc_store_stdout "${bin_file_from_asm_import}" "${import_options[@]}" stripCLIDecorations < "$bin_file_from_asm_import" > tmpfile diff --git a/solc/CommandLineInterface.cpp b/solc/CommandLineInterface.cpp index 4a7f34561fbe..90c67868d55f 100644 --- a/solc/CommandLineInterface.cpp +++ b/solc/CommandLineInterface.cpp @@ -927,6 +927,7 @@ void CommandLineInterface::compile() try { + m_compiler->setExperimental(m_options.experimental); if (m_options.metadata.literalSources) m_compiler->useMetadataLiteralSources(true); m_compiler->setMetadataFormat(m_options.metadata.format); diff --git a/solc/CommandLineParser.cpp b/solc/CommandLineParser.cpp index 50ce02bd14c8..61fa5d37003a 100644 --- a/solc/CommandLineParser.cpp +++ b/solc/CommandLineParser.cpp @@ -50,6 +50,7 @@ static std::string const g_strEVMVersion = "evm-version"; static std::string const g_strEOFVersion = "experimental-eof-version"; static std::string const g_strViaIR = "via-ir"; static std::string const g_strExperimentalViaIR = "experimental-via-ir"; +static std::string const g_strExperimental = "experimental"; static std::string const g_strGas = "gas"; static std::string const g_strHelp = "help"; static std::string const g_strImportAst = "import-ast"; @@ -157,6 +158,18 @@ void CommandLineParser::checkMutuallyExclusive(std::vector const& _ } } +void CommandLineParser::checkExperimental(std::vector const& _optionNames) +{ + if (!m_args.contains(g_strExperimental) && countEnabledOptions(_optionNames) > 0) + { + solThrow( + CommandLineValidationError, + "The following options are only available in experimental mode: " + joinOptionNames(_optionNames) + ". " + + "To toggle experimental mode, use the --experimental flag." + ); + } +} + bool CompilerOutputs::operator==(CompilerOutputs const& _other) const noexcept { for (bool CompilerOutputs::* member: componentMap() | ranges::views::values) @@ -936,6 +949,17 @@ General Information)").c_str(), ; desc.add(smtCheckerOptions); + po::options_description experimentalOptions("Experimental options"); + experimentalOptions.add_options() + ( + g_strExperimental.c_str(), + "Toggle experimental mode. Note that toggling experimental mode by itself will not " + "enable any experimental features, but will simply allow for such features to be enabled in the " + "usual manner, whether by using specific flags or pragmas." + ) + ; + desc.add(experimentalOptions); + desc.add_options()(g_strInputFile.c_str(), po::value>(), "input file"); return desc; } @@ -979,6 +1003,9 @@ void CommandLineParser::processArgs() else if (m_args.count(g_strColor) > 0) m_options.formatting.coloredOutput = true; + if (m_args.contains(g_strExperimental)) + m_options.experimental = true; + checkMutuallyExclusive({ g_strHelp, g_strLicense, @@ -992,6 +1019,18 @@ void CommandLineParser::processArgs() g_strImportEvmAssemblerJson, }); + checkExperimental({ + g_strLSP, + g_strImportAst, + g_strImportEvmAssemblerJson, + "ir-ast-json", + "ir-optimized-ast-json", + "yul-cfg-json", + "ethdebug", + "ethdebug-runtime", + g_strEOFVersion, + }); + if (m_args.count(g_strHelp) > 0) m_options.input.mode = InputMode::Help; else if (m_args.count(g_strLicense) > 0) @@ -1020,6 +1059,14 @@ void CommandLineParser::processArgs() ) return; + if (m_options.experimental && m_options.input.mode == InputMode::StandardJson) + solThrow( + CommandLineValidationError, + "Standard JSON input mode is incompatible with the --" + g_strExperimental + " flag. " + "Please use the appropriate experimental option in your Standard JSON input file to " + "enable experimental mode." + ); + if (m_args.count(g_strYul) > 0) solThrow( CommandLineValidationError, @@ -1092,6 +1139,7 @@ void CommandLineParser::processArgs() g_strPrettyJson, "srcmap", "srcmap-runtime", + g_strExperimental, }; for (auto const& [optionName, optionValue]: m_args) @@ -1159,6 +1207,12 @@ void CommandLineParser::processArgs() if (!m_options.output.debugInfoSelection.has_value()) solThrow(CommandLineValidationError, "Invalid value for --" + g_strDebugInfo + " option: " + optionValue); + if (!m_options.experimental && m_options.output.debugInfoSelection->ethdebug) + solThrow( + CommandLineValidationError, + "--" + g_strDebugInfo + " ethdebug can only be used by toggling the --" + g_strExperimental + " flag." + ); + if (m_options.output.debugInfoSelection->snippet && !m_options.output.debugInfoSelection->location) solThrow(CommandLineValidationError, "To use 'snippet' with --" + g_strDebugInfo + " you must select also 'location'."); } diff --git a/solc/CommandLineParser.h b/solc/CommandLineParser.h index d8141cb4fcf0..06e8da2282c6 100644 --- a/solc/CommandLineParser.h +++ b/solc/CommandLineParser.h @@ -245,6 +245,8 @@ struct CommandLineOptions bool initialize = false; ModelCheckerSettings settings; } modelChecker; + + bool experimental = false; }; /// Parses the command-line arguments and produces a filled-out CommandLineOptions structure. @@ -296,6 +298,7 @@ class CommandLineParser void parseOutputSelection(); void checkMutuallyExclusive(std::vector const& _optionNames); + void checkExperimental(std::vector const& _optionNames); size_t countEnabledOptions(std::vector const& _optionNames) const; static std::string joinOptionNames(std::vector const& _optionNames, std::string _separator = ", "); diff --git a/test/cmdlineTests/asm_json_import_sourcelist_with_null_elements/args b/test/cmdlineTests/asm_json_import_sourcelist_with_null_elements/args index c1bc80dabfcd..5634b014ddbf 100644 --- a/test/cmdlineTests/asm_json_import_sourcelist_with_null_elements/args +++ b/test/cmdlineTests/asm_json_import_sourcelist_with_null_elements/args @@ -1 +1 @@ ---pretty-json --json-indent 4 --import-asm-json - +--pretty-json --json-indent 4 --experimental --import-asm-json - diff --git a/test/cmdlineTests/asm_json_yul_export_evm_asm_import/args b/test/cmdlineTests/asm_json_yul_export_evm_asm_import/args index 15c962831667..7000d519f726 100644 --- a/test/cmdlineTests/asm_json_yul_export_evm_asm_import/args +++ b/test/cmdlineTests/asm_json_yul_export_evm_asm_import/args @@ -1 +1 @@ ---import-asm-json - --opcodes --asm --bin --asm-json --pretty-json --json-indent 4 +--experimental --import-asm-json - --opcodes --asm --bin --asm-json --pretty-json --json-indent 4 diff --git a/test/cmdlineTests/ast_ir/args b/test/cmdlineTests/ast_ir/args index d254bff83d54..ab35cc76b38f 100644 --- a/test/cmdlineTests/ast_ir/args +++ b/test/cmdlineTests/ast_ir/args @@ -1 +1 @@ ---ir-ast-json --ir-optimized-ast-json --optimize --pretty-json --json-indent 4 +--experimental --ir-ast-json --ir-optimized-ast-json --optimize --pretty-json --json-indent 4 diff --git a/test/cmdlineTests/ast_json_import_wrong_evmVersion/args b/test/cmdlineTests/ast_json_import_wrong_evmVersion/args index d8fddfec65db..d6692d825c6b 100644 --- a/test/cmdlineTests/ast_json_import_wrong_evmVersion/args +++ b/test/cmdlineTests/ast_json_import_wrong_evmVersion/args @@ -1 +1 @@ ---evm-version=homestead --import-ast --combined-json ast --pretty-json +--experimental --evm-version=homestead --import-ast --combined-json ast --pretty-json diff --git a/test/cmdlineTests/eof_unavailable_before_osaka/args b/test/cmdlineTests/eof_unavailable_before_osaka/args index 90e7e00e2552..7e9b7ee93624 100644 --- a/test/cmdlineTests/eof_unavailable_before_osaka/args +++ b/test/cmdlineTests/eof_unavailable_before_osaka/args @@ -1 +1 @@ ---optimize --experimental-eof-version 1 --evm-version cancun +--experimental --optimize --experimental-eof-version 1 --evm-version cancun diff --git a/test/cmdlineTests/ethdebug_debuginfo_without_experimental_flag/args b/test/cmdlineTests/ethdebug_debuginfo_without_experimental_flag/args new file mode 100644 index 000000000000..7b4e521b02b8 --- /dev/null +++ b/test/cmdlineTests/ethdebug_debuginfo_without_experimental_flag/args @@ -0,0 +1 @@ +--debug-info ethdebug diff --git a/test/cmdlineTests/ethdebug_debuginfo_without_experimental_flag/err b/test/cmdlineTests/ethdebug_debuginfo_without_experimental_flag/err new file mode 100644 index 000000000000..d8327f90bf42 --- /dev/null +++ b/test/cmdlineTests/ethdebug_debuginfo_without_experimental_flag/err @@ -0,0 +1 @@ +Error: --debug-info ethdebug can only be used by toggling the --experimental flag. diff --git a/test/cmdlineTests/ethdebug_debuginfo_without_experimental_flag/exit b/test/cmdlineTests/ethdebug_debuginfo_without_experimental_flag/exit new file mode 100644 index 000000000000..d00491fd7e5b --- /dev/null +++ b/test/cmdlineTests/ethdebug_debuginfo_without_experimental_flag/exit @@ -0,0 +1 @@ +1 diff --git a/test/cmdlineTests/ethdebug_debuginfo_without_experimental_flag/input.sol b/test/cmdlineTests/ethdebug_debuginfo_without_experimental_flag/input.sol new file mode 100644 index 000000000000..415509ef9aef --- /dev/null +++ b/test/cmdlineTests/ethdebug_debuginfo_without_experimental_flag/input.sol @@ -0,0 +1,6 @@ +// SPDX-License-Identifier: GPL-2.0 +pragma solidity >=0.0; + +contract C { + function f() public {} +} diff --git a/test/cmdlineTests/ethdebug_eof_container_osaka/args b/test/cmdlineTests/ethdebug_eof_container_osaka/args index 16466b842d0e..49c5bc838258 100644 --- a/test/cmdlineTests/ethdebug_eof_container_osaka/args +++ b/test/cmdlineTests/ethdebug_eof_container_osaka/args @@ -1 +1 @@ - --experimental-eof-version 1 --evm-version osaka --ethdebug --via-ir --pretty-json --json-indent 4 +--experimental --experimental-eof-version 1 --evm-version osaka --ethdebug --via-ir --pretty-json --json-indent 4 diff --git a/test/cmdlineTests/ethdebug_on_abstract/args b/test/cmdlineTests/ethdebug_on_abstract/args index c6018b329a67..c345d483a32a 100644 --- a/test/cmdlineTests/ethdebug_on_abstract/args +++ b/test/cmdlineTests/ethdebug_on_abstract/args @@ -1 +1 @@ ---ethdebug --via-ir --pretty-json --json-indent 4 +--experimental --ethdebug --via-ir --pretty-json --json-indent 4 diff --git a/test/cmdlineTests/ethdebug_on_interface/args b/test/cmdlineTests/ethdebug_on_interface/args index c6018b329a67..c345d483a32a 100644 --- a/test/cmdlineTests/ethdebug_on_interface/args +++ b/test/cmdlineTests/ethdebug_on_interface/args @@ -1 +1 @@ ---ethdebug --via-ir --pretty-json --json-indent 4 +--experimental --ethdebug --via-ir --pretty-json --json-indent 4 diff --git a/test/cmdlineTests/experimental_feature_without_experimental_flag/args b/test/cmdlineTests/experimental_feature_without_experimental_flag/args new file mode 100644 index 000000000000..a5ec4617b5f8 --- /dev/null +++ b/test/cmdlineTests/experimental_feature_without_experimental_flag/args @@ -0,0 +1 @@ +--ir-ast-json diff --git a/test/cmdlineTests/experimental_feature_without_experimental_flag/err b/test/cmdlineTests/experimental_feature_without_experimental_flag/err new file mode 100644 index 000000000000..1323ded19a91 --- /dev/null +++ b/test/cmdlineTests/experimental_feature_without_experimental_flag/err @@ -0,0 +1 @@ +Error: The following options are only available in experimental mode: --lsp, --import-ast, --import-asm-json, --ir-ast-json, --ir-optimized-ast-json, --yul-cfg-json, --ethdebug, --ethdebug-runtime, --experimental-eof-version. To toggle experimental mode, use the --experimental flag. diff --git a/test/cmdlineTests/experimental_feature_without_experimental_flag/exit b/test/cmdlineTests/experimental_feature_without_experimental_flag/exit new file mode 100644 index 000000000000..d00491fd7e5b --- /dev/null +++ b/test/cmdlineTests/experimental_feature_without_experimental_flag/exit @@ -0,0 +1 @@ +1 diff --git a/test/cmdlineTests/experimental_feature_without_experimental_flag/input.sol b/test/cmdlineTests/experimental_feature_without_experimental_flag/input.sol new file mode 100644 index 000000000000..0bea95d1ef4e --- /dev/null +++ b/test/cmdlineTests/experimental_feature_without_experimental_flag/input.sol @@ -0,0 +1,6 @@ +// SPDX-License-Identifier: GPL-2.0 +pragma solidity >=0.0; + +contract C { + function f() public {} +} diff --git a/test/cmdlineTests/experimental_flag_with_standard_json/args b/test/cmdlineTests/experimental_flag_with_standard_json/args new file mode 100644 index 000000000000..7ccf6da07de6 --- /dev/null +++ b/test/cmdlineTests/experimental_flag_with_standard_json/args @@ -0,0 +1 @@ +--experimental \ No newline at end of file diff --git a/test/cmdlineTests/experimental_flag_with_standard_json/err b/test/cmdlineTests/experimental_flag_with_standard_json/err new file mode 100644 index 000000000000..7f7c4c3a1fef --- /dev/null +++ b/test/cmdlineTests/experimental_flag_with_standard_json/err @@ -0,0 +1 @@ +Error: Standard JSON input mode is incompatible with the --experimental flag. Please use the appropriate experimental option in your Standard JSON input file to enable experimental mode. diff --git a/test/cmdlineTests/experimental_flag_with_standard_json/exit b/test/cmdlineTests/experimental_flag_with_standard_json/exit new file mode 100644 index 000000000000..d00491fd7e5b --- /dev/null +++ b/test/cmdlineTests/experimental_flag_with_standard_json/exit @@ -0,0 +1 @@ +1 diff --git a/test/cmdlineTests/experimental_flag_with_standard_json/input.json b/test/cmdlineTests/experimental_flag_with_standard_json/input.json new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/test/cmdlineTests/import_asm_json_all_valid_flags/args b/test/cmdlineTests/import_asm_json_all_valid_flags/args index e6010eac3b05..a1e89d7ae47a 100644 --- a/test/cmdlineTests/import_asm_json_all_valid_flags/args +++ b/test/cmdlineTests/import_asm_json_all_valid_flags/args @@ -1 +1 @@ ---pretty-json --json-indent 4 --combined-json bin,bin-runtime,opcodes,asm,srcmap,srcmap-runtime --asm --bin --bin-runtime --asm-json --import-asm-json - +--experimental --pretty-json --json-indent 4 --combined-json bin,bin-runtime,opcodes,asm,srcmap,srcmap-runtime --asm --bin --bin-runtime --asm-json --import-asm-json - diff --git a/test/cmdlineTests/import_asm_json_difficulty_prevrandao/args b/test/cmdlineTests/import_asm_json_difficulty_prevrandao/args index 2b4b3a1534b7..a31c9320b0af 100644 --- a/test/cmdlineTests/import_asm_json_difficulty_prevrandao/args +++ b/test/cmdlineTests/import_asm_json_difficulty_prevrandao/args @@ -1 +1 @@ ---import-asm-json - --opcodes --asm +--experimental --import-asm-json - --opcodes --asm diff --git a/test/cmdlineTests/import_asm_json_eof_unavailable_before_osaka/args b/test/cmdlineTests/import_asm_json_eof_unavailable_before_osaka/args index b5d6267fa5b0..7293bf52ab49 100644 --- a/test/cmdlineTests/import_asm_json_eof_unavailable_before_osaka/args +++ b/test/cmdlineTests/import_asm_json_eof_unavailable_before_osaka/args @@ -1 +1 @@ ---import-asm-json --experimental-eof-version 1 --evm-version cancun +--experimental --import-asm-json --experimental-eof-version 1 --evm-version cancun diff --git a/test/cmdlineTests/import_asm_json_hex_subassembly_indices/args b/test/cmdlineTests/import_asm_json_hex_subassembly_indices/args index 2b4b3a1534b7..a31c9320b0af 100644 --- a/test/cmdlineTests/import_asm_json_hex_subassembly_indices/args +++ b/test/cmdlineTests/import_asm_json_hex_subassembly_indices/args @@ -1 +1 @@ ---import-asm-json - --opcodes --asm +--experimental --import-asm-json - --opcodes --asm diff --git a/test/cmdlineTests/import_asm_json_invalid_data_not_hex/args b/test/cmdlineTests/import_asm_json_invalid_data_not_hex/args index 2b4b3a1534b7..a31c9320b0af 100644 --- a/test/cmdlineTests/import_asm_json_invalid_data_not_hex/args +++ b/test/cmdlineTests/import_asm_json_invalid_data_not_hex/args @@ -1 +1 @@ ---import-asm-json - --opcodes --asm +--experimental --import-asm-json - --opcodes --asm diff --git a/test/cmdlineTests/import_asm_json_invalid_data_not_object/args b/test/cmdlineTests/import_asm_json_invalid_data_not_object/args index 2b4b3a1534b7..a31c9320b0af 100644 --- a/test/cmdlineTests/import_asm_json_invalid_data_not_object/args +++ b/test/cmdlineTests/import_asm_json_invalid_data_not_object/args @@ -1 +1 @@ ---import-asm-json - --opcodes --asm +--experimental --import-asm-json - --opcodes --asm diff --git a/test/cmdlineTests/import_asm_json_invalid_jumptype_instruction/args b/test/cmdlineTests/import_asm_json_invalid_jumptype_instruction/args index 2b4b3a1534b7..a31c9320b0af 100644 --- a/test/cmdlineTests/import_asm_json_invalid_jumptype_instruction/args +++ b/test/cmdlineTests/import_asm_json_invalid_jumptype_instruction/args @@ -1 +1 @@ ---import-asm-json - --opcodes --asm +--experimental --import-asm-json - --opcodes --asm diff --git a/test/cmdlineTests/import_asm_json_invalid_value/args b/test/cmdlineTests/import_asm_json_invalid_value/args index 2b4b3a1534b7..a31c9320b0af 100644 --- a/test/cmdlineTests/import_asm_json_invalid_value/args +++ b/test/cmdlineTests/import_asm_json_invalid_value/args @@ -1 +1 @@ ---import-asm-json - --opcodes --asm +--experimental --import-asm-json - --opcodes --asm diff --git a/test/cmdlineTests/import_asm_json_missing_subobject_indices/args b/test/cmdlineTests/import_asm_json_missing_subobject_indices/args index 2b4b3a1534b7..a31c9320b0af 100644 --- a/test/cmdlineTests/import_asm_json_missing_subobject_indices/args +++ b/test/cmdlineTests/import_asm_json_missing_subobject_indices/args @@ -1 +1 @@ ---import-asm-json - --opcodes --asm +--experimental --import-asm-json - --opcodes --asm diff --git a/test/cmdlineTests/import_asm_json_no_optimize/args b/test/cmdlineTests/import_asm_json_no_optimize/args index 0af885908f1e..9dcc671fb0d4 100644 --- a/test/cmdlineTests/import_asm_json_no_optimize/args +++ b/test/cmdlineTests/import_asm_json_no_optimize/args @@ -1 +1 @@ ---import-asm-json - --asm +--experimental --import-asm-json - --asm diff --git a/test/cmdlineTests/import_asm_json_no_value/args b/test/cmdlineTests/import_asm_json_no_value/args index 2b4b3a1534b7..a31c9320b0af 100644 --- a/test/cmdlineTests/import_asm_json_no_value/args +++ b/test/cmdlineTests/import_asm_json_no_value/args @@ -1 +1 @@ ---import-asm-json - --opcodes --asm +--experimental --import-asm-json - --opcodes --asm diff --git a/test/cmdlineTests/import_asm_json_non_unique_sources/args b/test/cmdlineTests/import_asm_json_non_unique_sources/args index d27cc7bb214e..772c307ada1f 100644 --- a/test/cmdlineTests/import_asm_json_non_unique_sources/args +++ b/test/cmdlineTests/import_asm_json_non_unique_sources/args @@ -1 +1 @@ ---asm-json --import-asm-json - +--experimental --asm-json --import-asm-json - diff --git a/test/cmdlineTests/import_asm_json_optimize/args b/test/cmdlineTests/import_asm_json_optimize/args index b9370e6e4f11..1a7274261028 100644 --- a/test/cmdlineTests/import_asm_json_optimize/args +++ b/test/cmdlineTests/import_asm_json_optimize/args @@ -1 +1 @@ ---optimize --import-asm-json - --asm +--experimental --optimize --import-asm-json - --asm diff --git a/test/cmdlineTests/import_asm_json_out_of_range_data_index/args b/test/cmdlineTests/import_asm_json_out_of_range_data_index/args index 2b4b3a1534b7..a31c9320b0af 100644 --- a/test/cmdlineTests/import_asm_json_out_of_range_data_index/args +++ b/test/cmdlineTests/import_asm_json_out_of_range_data_index/args @@ -1 +1 @@ ---import-asm-json - --opcodes --asm +--experimental --import-asm-json - --opcodes --asm diff --git a/test/cmdlineTests/import_asm_json_random_order_data_index/args b/test/cmdlineTests/import_asm_json_random_order_data_index/args index 2b4b3a1534b7..a31c9320b0af 100644 --- a/test/cmdlineTests/import_asm_json_random_order_data_index/args +++ b/test/cmdlineTests/import_asm_json_random_order_data_index/args @@ -1 +1 @@ ---import-asm-json - --opcodes --asm +--experimental --import-asm-json - --opcodes --asm diff --git a/test/cmdlineTests/import_asm_json_unrecognized_field/args b/test/cmdlineTests/import_asm_json_unrecognized_field/args index 2b4b3a1534b7..a31c9320b0af 100644 --- a/test/cmdlineTests/import_asm_json_unrecognized_field/args +++ b/test/cmdlineTests/import_asm_json_unrecognized_field/args @@ -1 +1 @@ ---import-asm-json - --opcodes --asm +--experimental --import-asm-json - --opcodes --asm diff --git a/test/cmdlineTests/import_asm_json_untagged_jumpdest/args b/test/cmdlineTests/import_asm_json_untagged_jumpdest/args index 2b4b3a1534b7..a31c9320b0af 100644 --- a/test/cmdlineTests/import_asm_json_untagged_jumpdest/args +++ b/test/cmdlineTests/import_asm_json_untagged_jumpdest/args @@ -1 +1 @@ ---import-asm-json - --opcodes --asm +--experimental --import-asm-json - --opcodes --asm diff --git a/test/cmdlineTests/import_asm_json_verbatim/args b/test/cmdlineTests/import_asm_json_verbatim/args index 2b4b3a1534b7..a31c9320b0af 100644 --- a/test/cmdlineTests/import_asm_json_verbatim/args +++ b/test/cmdlineTests/import_asm_json_verbatim/args @@ -1 +1 @@ ---import-asm-json - --opcodes --asm +--experimental --import-asm-json - --opcodes --asm diff --git a/test/cmdlineTests/import_asm_json_yul_more_subobjects/args b/test/cmdlineTests/import_asm_json_yul_more_subobjects/args index 58dfc8cc7348..7de136d4bdc0 100644 --- a/test/cmdlineTests/import_asm_json_yul_more_subobjects/args +++ b/test/cmdlineTests/import_asm_json_yul_more_subobjects/args @@ -1 +1 @@ ---import-asm-json - --opcodes +--experimental --import-asm-json - --opcodes diff --git a/test/cmdlineTests/import_asm_json_yul_subobjects/args b/test/cmdlineTests/import_asm_json_yul_subobjects/args index 58dfc8cc7348..7de136d4bdc0 100644 --- a/test/cmdlineTests/import_asm_json_yul_subobjects/args +++ b/test/cmdlineTests/import_asm_json_yul_subobjects/args @@ -1 +1 @@ ---import-asm-json - --opcodes +--experimental --import-asm-json - --opcodes diff --git a/test/cmdlineTests/standard_cli_import_ast_storage_layout_specifier_missing_expression/args b/test/cmdlineTests/standard_cli_import_ast_storage_layout_specifier_missing_expression/args index f0b85640bd48..6316340979bf 100644 --- a/test/cmdlineTests/standard_cli_import_ast_storage_layout_specifier_missing_expression/args +++ b/test/cmdlineTests/standard_cli_import_ast_storage_layout_specifier_missing_expression/args @@ -1 +1 @@ ---import-ast - \ No newline at end of file +--experimental --import-ast - \ No newline at end of file diff --git a/test/cmdlineTests/strict_asm_eof_container_osaka/args b/test/cmdlineTests/strict_asm_eof_container_osaka/args index 60abde356339..1a99e4be6832 100644 --- a/test/cmdlineTests/strict_asm_eof_container_osaka/args +++ b/test/cmdlineTests/strict_asm_eof_container_osaka/args @@ -1 +1 @@ - --strict-assembly --experimental-eof-version 1 --evm-version osaka --asm --ir-optimized --bin --debug-info none +--experimental --strict-assembly --experimental-eof-version 1 --evm-version osaka --asm --ir-optimized --bin --debug-info none diff --git a/test/cmdlineTests/strict_asm_eof_dataloadn_osaka/args b/test/cmdlineTests/strict_asm_eof_dataloadn_osaka/args index 60abde356339..1a99e4be6832 100644 --- a/test/cmdlineTests/strict_asm_eof_dataloadn_osaka/args +++ b/test/cmdlineTests/strict_asm_eof_dataloadn_osaka/args @@ -1 +1 @@ - --strict-assembly --experimental-eof-version 1 --evm-version osaka --asm --ir-optimized --bin --debug-info none +--experimental --strict-assembly --experimental-eof-version 1 --evm-version osaka --asm --ir-optimized --bin --debug-info none diff --git a/test/cmdlineTests/strict_asm_eof_unavailable_before_osaka/args b/test/cmdlineTests/strict_asm_eof_unavailable_before_osaka/args index 7ec243fdeb21..c7b8a5a6ac2a 100644 --- a/test/cmdlineTests/strict_asm_eof_unavailable_before_osaka/args +++ b/test/cmdlineTests/strict_asm_eof_unavailable_before_osaka/args @@ -1 +1 @@ ---strict-assembly --experimental-eof-version 1 --evm-version cancun +--experimental --strict-assembly --experimental-eof-version 1 --evm-version cancun diff --git a/test/cmdlineTests/strict_asm_yul_cfg_json_export/args b/test/cmdlineTests/strict_asm_yul_cfg_json_export/args index 1147466b54ef..ecd27ca32a81 100644 --- a/test/cmdlineTests/strict_asm_yul_cfg_json_export/args +++ b/test/cmdlineTests/strict_asm_yul_cfg_json_export/args @@ -1 +1 @@ ---strict-assembly --optimize --yul-cfg-json --pretty-json --json-indent 4 +--experimental --strict-assembly --optimize --yul-cfg-json --pretty-json --json-indent 4 diff --git a/test/cmdlineTests/undeployable_contract_empty_outputs/args b/test/cmdlineTests/undeployable_contract_empty_outputs/args index 74c8e867fc91..17068d35dda4 100644 --- a/test/cmdlineTests/undeployable_contract_empty_outputs/args +++ b/test/cmdlineTests/undeployable_contract_empty_outputs/args @@ -1 +1 @@ ---bin --bin-runtime --opcodes --asm --ir --ir-ast-json --ir-optimized --ir-optimized-ast-json --gas --asm-json --abi --hashes --optimize --pretty-json --json-indent 4 +--experimental --bin --bin-runtime --opcodes --asm --ir --ir-ast-json --ir-optimized --ir-optimized-ast-json --gas --asm-json --abi --hashes --optimize --pretty-json --json-indent 4 diff --git a/test/cmdlineTests/yul_cfg_json_export/args b/test/cmdlineTests/yul_cfg_json_export/args index 4af41df671fb..b03ca0ef51f0 100644 --- a/test/cmdlineTests/yul_cfg_json_export/args +++ b/test/cmdlineTests/yul_cfg_json_export/args @@ -1 +1 @@ ---via-ir --optimize --yul-cfg-json --pretty-json --json-indent 4 +--experimental --via-ir --optimize --yul-cfg-json --pretty-json --json-indent 4 diff --git a/test/libsolidity/Assembly.cpp b/test/libsolidity/Assembly.cpp index bf9c6b16afb9..85d6a39820af 100644 --- a/test/libsolidity/Assembly.cpp +++ b/test/libsolidity/Assembly.cpp @@ -66,7 +66,7 @@ evmasm::AssemblyItems compileContract(std::shared_ptr _sourceCode) BOOST_CHECK(!!sourceUnit); Scoper::assignScopes(*sourceUnit); - BOOST_REQUIRE(SyntaxChecker(errorReporter, false).checkSyntax(*sourceUnit)); + BOOST_REQUIRE(SyntaxChecker(errorReporter, false, false).checkSyntax(*sourceUnit)); GlobalContext globalContext(solidity::test::CommonOptions::get().evmVersion()); NameAndTypeResolver resolver(globalContext, solidity::test::CommonOptions::get().evmVersion(), errorReporter, false); DeclarationTypeChecker declarationTypeChecker(errorReporter, solidity::test::CommonOptions::get().evmVersion()); diff --git a/test/libsolidity/FunctionDependencyGraphTest.cpp b/test/libsolidity/FunctionDependencyGraphTest.cpp index c7992d2a2c36..ded643e68209 100644 --- a/test/libsolidity/FunctionDependencyGraphTest.cpp +++ b/test/libsolidity/FunctionDependencyGraphTest.cpp @@ -42,6 +42,8 @@ TestCase::TestResult FunctionDependencyGraphTest::run(std::ostream& _stream, std compiler().setSources(StringMap{{"", m_source}}); compiler().setViaIR(true); compiler().setOptimiserSettings(OptimiserSettings::none()); + // Experimental on by default as this is an extension of the initial experimental Solidity + compiler().setExperimental(true); if (!compiler().compile(CompilerStack::AnalysisSuccessful)) { printPrefixed(_stream, formatErrors(filteredErrors(), _formatted), _linePrefix); diff --git a/test/libsolidity/FunctionDependencyGraphTest.h b/test/libsolidity/FunctionDependencyGraphTest.h index 83f3eb0ab394..4b6b78a97088 100644 --- a/test/libsolidity/FunctionDependencyGraphTest.h +++ b/test/libsolidity/FunctionDependencyGraphTest.h @@ -24,8 +24,6 @@ #include #include -#include -#include namespace solidity::frontend::test { diff --git a/test/libsolidity/Metadata.cpp b/test/libsolidity/Metadata.cpp index 3b7d101d5948..0b6bae28dbd5 100644 --- a/test/libsolidity/Metadata.cpp +++ b/test/libsolidity/Metadata.cpp @@ -104,6 +104,7 @@ BOOST_AUTO_TEST_CASE(metadata_stamp) compilerStack.setEVMVersion(solidity::test::CommonOptions::get().evmVersion()); compilerStack.setOptimiserSettings(solidity::test::CommonOptions::get().optimize); compilerStack.setMetadataHash(metadataHash); + compilerStack.setExperimental(true); // Experimental pragma requires it BOOST_REQUIRE_MESSAGE(compilerStack.compile(), "Compiling contract failed"); bytes const& bytecode = compilerStack.runtimeObject("test").bytecode; std::string const& metadata = compilerStack.metadata("test"); @@ -177,6 +178,7 @@ BOOST_AUTO_TEST_CASE(metadata_stamp_experimental) compilerStack.setEVMVersion(solidity::test::CommonOptions::get().evmVersion()); compilerStack.setOptimiserSettings(solidity::test::CommonOptions::get().optimize); compilerStack.setMetadataHash(metadataHash); + compilerStack.setExperimental(true); // Experimental pragma requires it BOOST_REQUIRE_MESSAGE(compilerStack.compile(), "Compiling contract failed"); bytes const& bytecode = compilerStack.runtimeObject("test").bytecode; std::string const& metadata = compilerStack.metadata("test"); diff --git a/test/libsolidity/SemanticTest.cpp b/test/libsolidity/SemanticTest.cpp index 1b66dd60fffb..4fb29b6dfffd 100644 --- a/test/libsolidity/SemanticTest.cpp +++ b/test/libsolidity/SemanticTest.cpp @@ -112,6 +112,7 @@ SemanticTest::SemanticTest( m_revertStrings = revertStrings.value(); m_allowNonExistingFunctions = m_reader.boolSetting("allowNonExistingFunctions", false); + m_compiler.setExperimental(m_reader.boolSetting("experimental", false)); parseExpectations(m_reader.stream()); soltestAssert(!m_tests.empty(), "No tests specified in " + _filename); diff --git a/test/libsolidity/SolidityExpressionCompiler.cpp b/test/libsolidity/SolidityExpressionCompiler.cpp index b6d40eed029a..d64ffac5b72f 100644 --- a/test/libsolidity/SolidityExpressionCompiler.cpp +++ b/test/libsolidity/SolidityExpressionCompiler.cpp @@ -126,7 +126,7 @@ bytes compileFirstExpression( ErrorReporter errorReporter(errors); GlobalContext globalContext(solidity::test::CommonOptions::get().evmVersion()); Scoper::assignScopes(*sourceUnit); - BOOST_REQUIRE(SyntaxChecker(errorReporter, false).checkSyntax(*sourceUnit)); + BOOST_REQUIRE(SyntaxChecker(errorReporter, false, false).checkSyntax(*sourceUnit)); NameAndTypeResolver resolver(globalContext, solidity::test::CommonOptions::get().evmVersion(), errorReporter, false); resolver.registerDeclarations(*sourceUnit); BOOST_REQUIRE_MESSAGE(resolver.resolveNamesAndTypes(*sourceUnit), "Resolving names failed"); diff --git a/test/libsolidity/SyntaxTest.cpp b/test/libsolidity/SyntaxTest.cpp index 8944710542a5..23b92bcb1d51 100644 --- a/test/libsolidity/SyntaxTest.cpp +++ b/test/libsolidity/SyntaxTest.cpp @@ -51,13 +51,14 @@ SyntaxTest::SyntaxTest( auto const eofEnabled = solidity::test::CommonOptions::get().eofVersion().has_value(); m_compileViaYul = m_reader.stringSetting("compileViaYul", eofEnabled ? "true" : "false"); - if (!util::contains(compileViaYulAllowedValues, m_compileViaYul)) + if (!compileViaYulAllowedValues.contains(m_compileViaYul)) BOOST_THROW_EXCEPTION(std::runtime_error("Invalid compileViaYul value: " + m_compileViaYul + ".")); if (m_compileViaYul == "false" && eofEnabled) m_shouldRun = false; m_optimiseYul = m_reader.boolSetting("optimize-yul", true); + m_experimental = m_reader.boolSetting("experimental", false); static std::map const pipelineStages = { {"parsing", PipelineStage::Parsing}, @@ -81,6 +82,7 @@ void SyntaxTest::setupCompiler(CompilerStack& _compiler) OptimiserSettings::minimal() ); _compiler.setViaIR(m_compileViaYul == "true"); + _compiler.setExperimental(m_experimental); _compiler.setMetadataFormat(CompilerStack::MetadataFormat::NoMetadata); _compiler.setMetadataHash(CompilerStack::MetadataHash::None); } diff --git a/test/libsolidity/SyntaxTest.h b/test/libsolidity/SyntaxTest.h index 085a32f944ea..9c52acd9bc59 100644 --- a/test/libsolidity/SyntaxTest.h +++ b/test/libsolidity/SyntaxTest.h @@ -53,6 +53,7 @@ class SyntaxTest: public AnalysisFramework, public solidity::test::CommonSyntaxT virtual void filterObtainedErrors(); bool m_optimiseYul{}; + bool m_experimental{false}; std::string m_compileViaYul{}; langutil::Error::Severity m_minSeverity{}; PipelineStage m_stopAfter; diff --git a/test/libsolidity/semanticTests/experimental/stub.sol b/test/libsolidity/semanticTests/experimental/stub.sol index d2d0999bfb76..7cc1c3033400 100644 --- a/test/libsolidity/semanticTests/experimental/stub.sol +++ b/test/libsolidity/semanticTests/experimental/stub.sol @@ -89,6 +89,7 @@ contract C { } } // ==== +// experimental: true // EVMVersion: >=constantinople // ==== // compileViaYul: true diff --git a/test/libsolidity/semanticTests/experimental/type_class.sol b/test/libsolidity/semanticTests/experimental/type_class.sol index 7331c0dbd73c..4f101a147476 100644 --- a/test/libsolidity/semanticTests/experimental/type_class.sol +++ b/test/libsolidity/semanticTests/experimental/type_class.sol @@ -61,6 +61,7 @@ contract C { } // ==== +// experimental: true // EVMVersion: >=constantinople // compileViaYul: true // bytecodeFormat: legacy diff --git a/test/libsolidity/smtCheckerTests/options/pragma.sol b/test/libsolidity/smtCheckerTests/options/pragma.sol index b3e35ee02238..af2f644ad5ea 100644 --- a/test/libsolidity/smtCheckerTests/options/pragma.sol +++ b/test/libsolidity/smtCheckerTests/options/pragma.sol @@ -4,6 +4,8 @@ contract C { assert(x > 0); } } +// ==== +// experimental: true // ---- // Warning 5523: (0-31): The SMTChecker pragma has been deprecated and will be removed in the future. Please use the "model checker engine" compiler setting to activate the SMTChecker instead. If the pragma is enabled, all engines will be used. // Warning 6328: (90-103): CHC: Assertion violation happens here.\nCounterexample:\n\nx = 0\n\nTransaction trace:\nC.constructor()\nC.f(0) diff --git a/test/libsolidity/smtCheckerTests/types/struct/struct_constructor_fixed_bytes_from_string_1.sol b/test/libsolidity/smtCheckerTests/types/struct/struct_constructor_fixed_bytes_from_string_1.sol index 30d6da4a468e..f31b9ca88e08 100644 --- a/test/libsolidity/smtCheckerTests/types/struct/struct_constructor_fixed_bytes_from_string_1.sol +++ b/test/libsolidity/smtCheckerTests/types/struct/struct_constructor_fixed_bytes_from_string_1.sol @@ -9,6 +9,8 @@ contract C { assert(S({a:2, b:""}).a == 0); // should fail } } +// ==== +// experimental: true // ---- // Warning 5523: (0-31): The SMTChecker pragma has been deprecated and will be removed in the future. Please use the "model checker engine" compiler setting to activate the SMTChecker instead. If the pragma is enabled, all engines will be used. // Warning 6328: (178-207): CHC: Assertion violation happens here. diff --git a/test/libsolidity/syntaxTests/abiEncoder/conflicting_settings_reverse.sol b/test/libsolidity/syntaxTests/abiEncoder/conflicting_settings_reverse.sol index f06b2458c36d..c2a97d90fc11 100644 --- a/test/libsolidity/syntaxTests/abiEncoder/conflicting_settings_reverse.sol +++ b/test/libsolidity/syntaxTests/abiEncoder/conflicting_settings_reverse.sol @@ -1,4 +1,6 @@ pragma abicoder v1; pragma abicoder v2; +// ==== +// experimental: true // ---- // SyntaxError 3845: (20-39): ABI coder has already been selected for this source unit. diff --git a/test/libsolidity/syntaxTests/abiEncoder/conflicting_settings_reverse_experimental.sol b/test/libsolidity/syntaxTests/abiEncoder/conflicting_settings_reverse_experimental.sol index 855378e9ef60..0aa885854829 100644 --- a/test/libsolidity/syntaxTests/abiEncoder/conflicting_settings_reverse_experimental.sol +++ b/test/libsolidity/syntaxTests/abiEncoder/conflicting_settings_reverse_experimental.sol @@ -1,4 +1,6 @@ pragma abicoder v1; pragma experimental ABIEncoderV2; +// ==== +// experimental: true // ---- // SyntaxError 8273: (20-53): ABI coder v1 has already been selected through "pragma abicoder v1". diff --git a/test/libsolidity/syntaxTests/abiEncoder/same_setting_twice.sol b/test/libsolidity/syntaxTests/abiEncoder/same_setting_twice.sol index 0303bcb14900..fcdc2d5bbcbb 100644 --- a/test/libsolidity/syntaxTests/abiEncoder/same_setting_twice.sol +++ b/test/libsolidity/syntaxTests/abiEncoder/same_setting_twice.sol @@ -1,4 +1,6 @@ pragma experimental ABIEncoderV2; pragma abicoder v2; +// ==== +// experimental: true // ---- // SyntaxError 3845: (34-53): ABI coder has already been selected for this source unit. diff --git a/test/libsolidity/syntaxTests/abiEncoder/selected_twice_v2.sol b/test/libsolidity/syntaxTests/abiEncoder/selected_twice_v2.sol index 0b296da3a86a..848efa83e9b3 100644 --- a/test/libsolidity/syntaxTests/abiEncoder/selected_twice_v2.sol +++ b/test/libsolidity/syntaxTests/abiEncoder/selected_twice_v2.sol @@ -1,3 +1,5 @@ pragma abicoder v2; pragma experimental ABIEncoderV2; +// ==== +// experimental: true // ---- diff --git a/test/libsolidity/syntaxTests/experimental/builtin/builtin_type_definition.sol b/test/libsolidity/syntaxTests/experimental/builtin/builtin_type_definition.sol index 74a659cd8b83..f4d53061f127 100644 --- a/test/libsolidity/syntaxTests/experimental/builtin/builtin_type_definition.sol +++ b/test/libsolidity/syntaxTests/experimental/builtin/builtin_type_definition.sol @@ -30,6 +30,7 @@ contract C { } } // ==== +// experimental: true // EVMVersion: >=constantinople // compileViaYul: true // bytecodeFormat: legacy diff --git a/test/libsolidity/syntaxTests/experimental/builtin/builtin_type_definition_duplicate.sol b/test/libsolidity/syntaxTests/experimental/builtin/builtin_type_definition_duplicate.sol index 28f6c39fd754..720bb8c2724c 100644 --- a/test/libsolidity/syntaxTests/experimental/builtin/builtin_type_definition_duplicate.sol +++ b/test/libsolidity/syntaxTests/experimental/builtin/builtin_type_definition_duplicate.sol @@ -9,6 +9,7 @@ type word2 = __builtin("word"); type fun1(T, U) = __builtin("fun"); type fun2(T, U) = __builtin("fun"); // ==== +// experimental: true // EVMVersion: >=constantinople // ---- // Warning 2264: (0-29): Experimental features are turned on. Do not use experimental features on live deployments. diff --git a/test/libsolidity/syntaxTests/experimental/builtin/builtin_type_definition_unknown.sol b/test/libsolidity/syntaxTests/experimental/builtin/builtin_type_definition_unknown.sol index 90072f19838f..0dc19b7f8470 100644 --- a/test/libsolidity/syntaxTests/experimental/builtin/builtin_type_definition_unknown.sol +++ b/test/libsolidity/syntaxTests/experimental/builtin/builtin_type_definition_unknown.sol @@ -2,6 +2,7 @@ pragma experimental solidity; type someUnknownType = __builtin("someUnknownType"); // ==== +// experimental: true // EVMVersion: >=constantinople // ---- // Warning 2264: (0-29): Experimental features are turned on. Do not use experimental features on live deployments. diff --git a/test/libsolidity/syntaxTests/experimental/forall/undeclared_type_variable_in_function.sol b/test/libsolidity/syntaxTests/experimental/forall/undeclared_type_variable_in_function.sol index da1169969143..ef6331740ea4 100644 --- a/test/libsolidity/syntaxTests/experimental/forall/undeclared_type_variable_in_function.sol +++ b/test/libsolidity/syntaxTests/experimental/forall/undeclared_type_variable_in_function.sol @@ -7,6 +7,7 @@ function f(p: P, q: T(Q)) { let s: S; } // ==== +// experimental: true // EVMVersion: >=constantinople // ---- // Warning 2264: (0-29): Experimental features are turned on. Do not use experimental features on live deployments. diff --git a/test/libsolidity/syntaxTests/experimental/forall/undeclared_type_variable_in_quantified_function.sol b/test/libsolidity/syntaxTests/experimental/forall/undeclared_type_variable_in_quantified_function.sol index 91b734569372..5113860bdc8a 100644 --- a/test/libsolidity/syntaxTests/experimental/forall/undeclared_type_variable_in_quantified_function.sol +++ b/test/libsolidity/syntaxTests/experimental/forall/undeclared_type_variable_in_quantified_function.sol @@ -5,6 +5,7 @@ function f(b: B) { let c: C; } // ==== +// experimental: true // EVMVersion: >=constantinople // ---- // Warning 2264: (0-29): Experimental features are turned on. Do not use experimental features on live deployments. diff --git a/test/libsolidity/syntaxTests/experimental/forall/undeclared_type_variable_in_type_class.sol b/test/libsolidity/syntaxTests/experimental/forall/undeclared_type_variable_in_type_class.sol index 8af0cce82699..c78603516580 100644 --- a/test/libsolidity/syntaxTests/experimental/forall/undeclared_type_variable_in_type_class.sol +++ b/test/libsolidity/syntaxTests/experimental/forall/undeclared_type_variable_in_type_class.sol @@ -10,6 +10,7 @@ instantiation T(Y): C { function f(self: T(Z)) {} } // ==== +// experimental: true // EVMVersion: >=constantinople // ---- // Warning 2264: (0-29): Experimental features are turned on. Do not use experimental features on live deployments. diff --git a/test/libsolidity/syntaxTests/experimental/import/experimental_solidity.sol b/test/libsolidity/syntaxTests/experimental/import/experimental_solidity.sol index a84ac0e759ab..011043f66fea 100644 --- a/test/libsolidity/syntaxTests/experimental/import/experimental_solidity.sol +++ b/test/libsolidity/syntaxTests/experimental/import/experimental_solidity.sol @@ -1,5 +1,6 @@ pragma experimental solidity; // ==== +// experimental: true // EVMVersion: >=constantinople // compileViaYul: true // ---- diff --git a/test/libsolidity/syntaxTests/experimental/import/experimental_solidity_multisource_not_all_enable.sol b/test/libsolidity/syntaxTests/experimental/import/experimental_solidity_multisource_not_all_enable.sol index fe4125e84303..79f226535ee8 100644 --- a/test/libsolidity/syntaxTests/experimental/import/experimental_solidity_multisource_not_all_enable.sol +++ b/test/libsolidity/syntaxTests/experimental/import/experimental_solidity_multisource_not_all_enable.sol @@ -19,6 +19,7 @@ contract D { A a; } // ==== +// experimental: true // EVMVersion: >=constantinople // ---- // ParserError 2141: (B.sol:0-29): File declares "pragma experimental solidity". If you want to enable the experimental mode, all source units must include the pragma. diff --git a/test/libsolidity/syntaxTests/experimental/import/experimental_solidity_out_of_order_1.sol b/test/libsolidity/syntaxTests/experimental/import/experimental_solidity_out_of_order_1.sol index d6741b0d3a99..1ceecba27e4f 100644 --- a/test/libsolidity/syntaxTests/experimental/import/experimental_solidity_out_of_order_1.sol +++ b/test/libsolidity/syntaxTests/experimental/import/experimental_solidity_out_of_order_1.sol @@ -2,6 +2,7 @@ contract A {} pragma experimental solidity; // ==== +// experimental: true // EVMVersion: >=constantinople // ---- // ParserError 8185: (45-45): Experimental pragma "solidity" can only be set at the beginning of the source unit. diff --git a/test/libsolidity/syntaxTests/experimental/import/experimental_solidity_out_of_order_2.sol b/test/libsolidity/syntaxTests/experimental/import/experimental_solidity_out_of_order_2.sol index 940bd3fbb369..6d1ba15e2b50 100644 --- a/test/libsolidity/syntaxTests/experimental/import/experimental_solidity_out_of_order_2.sol +++ b/test/libsolidity/syntaxTests/experimental/import/experimental_solidity_out_of_order_2.sol @@ -10,6 +10,7 @@ struct A uint256 x; } // ==== +// experimental: true // EVMVersion: >=constantinople // ---- // ParserError 8185: (83-89): Experimental pragma "solidity" can only be set at the beginning of the source unit. diff --git a/test/libsolidity/syntaxTests/experimental/import/experimental_solidity_wrong_evm_version.sol b/test/libsolidity/syntaxTests/experimental/import/experimental_solidity_wrong_evm_version.sol index 3e070535b03d..be5a30d528da 100644 --- a/test/libsolidity/syntaxTests/experimental/import/experimental_solidity_wrong_evm_version.sol +++ b/test/libsolidity/syntaxTests/experimental/import/experimental_solidity_wrong_evm_version.sol @@ -3,6 +3,7 @@ pragma experimental solidity; contract C {} // ==== +// experimental: true // EVMVersion: =constantinople // compileViaYul: true // ---- diff --git a/test/libsolidity/syntaxTests/experimental/import/parsing_stdlib_import_2.sol b/test/libsolidity/syntaxTests/experimental/import/parsing_stdlib_import_2.sol index bdc66e4ad393..cc3146664cdd 100644 --- a/test/libsolidity/syntaxTests/experimental/import/parsing_stdlib_import_2.sol +++ b/test/libsolidity/syntaxTests/experimental/import/parsing_stdlib_import_2.sol @@ -2,6 +2,7 @@ pragma experimental solidity; import std.stub as stub; // ==== +// experimental: true // EVMVersion: >=constantinople // compileViaYul: true // ---- diff --git a/test/libsolidity/syntaxTests/experimental/import/parsing_stdlib_import_3.sol b/test/libsolidity/syntaxTests/experimental/import/parsing_stdlib_import_3.sol index 1bb340536c11..26b9589d0fce 100644 --- a/test/libsolidity/syntaxTests/experimental/import/parsing_stdlib_import_3.sol +++ b/test/libsolidity/syntaxTests/experimental/import/parsing_stdlib_import_3.sol @@ -2,6 +2,7 @@ pragma experimental solidity; import { identity } from std.stub; // ==== +// experimental: true // EVMVersion: >=constantinople // compileViaYul: true // ---- diff --git a/test/libsolidity/syntaxTests/experimental/import/parsing_stdlib_import_4.sol b/test/libsolidity/syntaxTests/experimental/import/parsing_stdlib_import_4.sol index 64a67fe6c96d..36df8c7c16aa 100644 --- a/test/libsolidity/syntaxTests/experimental/import/parsing_stdlib_import_4.sol +++ b/test/libsolidity/syntaxTests/experimental/import/parsing_stdlib_import_4.sol @@ -2,6 +2,7 @@ pragma experimental solidity; import * as stub from std.stub; // ==== +// experimental: true // EVMVersion: >=constantinople // compileViaYul: true // ---- diff --git a/test/libsolidity/syntaxTests/experimental/inference/import_and_call_stdlib_function.sol b/test/libsolidity/syntaxTests/experimental/inference/import_and_call_stdlib_function.sol index 72af2133f206..bbb255568d62 100644 --- a/test/libsolidity/syntaxTests/experimental/inference/import_and_call_stdlib_function.sol +++ b/test/libsolidity/syntaxTests/experimental/inference/import_and_call_stdlib_function.sol @@ -11,6 +11,7 @@ contract C } // ==== +// experimental: true // EVMVersion: >=constantinople // compileViaYul: true // bytecodeFormat: legacy diff --git a/test/libsolidity/syntaxTests/experimental/inference/instantiation_invalid_type_constructor.sol b/test/libsolidity/syntaxTests/experimental/inference/instantiation_invalid_type_constructor.sol index 0245deb1f401..15c40093265b 100644 --- a/test/libsolidity/syntaxTests/experimental/inference/instantiation_invalid_type_constructor.sol +++ b/test/libsolidity/syntaxTests/experimental/inference/instantiation_invalid_type_constructor.sol @@ -6,6 +6,7 @@ function f() {} instantiation f: C {} // ==== +// experimental: true // EVMVersion: >=constantinople // compileViaYul: true // ---- diff --git a/test/libsolidity/syntaxTests/experimental/inference/instantiation_member_type_does_not_match_declaration.sol b/test/libsolidity/syntaxTests/experimental/inference/instantiation_member_type_does_not_match_declaration.sol index 1c845b8eeece..47d282a1a23f 100644 --- a/test/libsolidity/syntaxTests/experimental/inference/instantiation_member_type_does_not_match_declaration.sol +++ b/test/libsolidity/syntaxTests/experimental/inference/instantiation_member_type_does_not_match_declaration.sol @@ -11,6 +11,7 @@ instantiation T: C { function f(self: U) {} } // ==== +// experimental: true // EVMVersion: >=constantinople // compileViaYul: true // ---- diff --git a/test/libsolidity/syntaxTests/experimental/inference/instantiation_not_for_class.sol b/test/libsolidity/syntaxTests/experimental/inference/instantiation_not_for_class.sol index c48fff74f94e..89217a56d89d 100644 --- a/test/libsolidity/syntaxTests/experimental/inference/instantiation_not_for_class.sol +++ b/test/libsolidity/syntaxTests/experimental/inference/instantiation_not_for_class.sol @@ -5,6 +5,7 @@ type U; instantiation T: U {} // ==== +// experimental: true // EVMVersion: >=constantinople // compileViaYul: true // ---- diff --git a/test/libsolidity/syntaxTests/experimental/inference/invalid_type_referenced.sol b/test/libsolidity/syntaxTests/experimental/inference/invalid_type_referenced.sol index ac097bf3927f..98bd7890ce81 100644 --- a/test/libsolidity/syntaxTests/experimental/inference/invalid_type_referenced.sol +++ b/test/libsolidity/syntaxTests/experimental/inference/invalid_type_referenced.sol @@ -7,6 +7,7 @@ class Self: C function g(self: Self, x: f); } // ==== +// experimental: true // EVMVersion: >=constantinople // ---- // Warning 2264: (0-29): Experimental features are turned on. Do not use experimental features on live deployments. diff --git a/test/libsolidity/syntaxTests/experimental/inference/monomorphic_function_call_type_mismatch.sol b/test/libsolidity/syntaxTests/experimental/inference/monomorphic_function_call_type_mismatch.sol index e7af573aeed6..d32b2ba0ed2c 100644 --- a/test/libsolidity/syntaxTests/experimental/inference/monomorphic_function_call_type_mismatch.sol +++ b/test/libsolidity/syntaxTests/experimental/inference/monomorphic_function_call_type_mismatch.sol @@ -9,6 +9,7 @@ function run(a: U, b: T) { f(a, b); } // ==== +// experimental: true // EVMVersion: >=constantinople // ---- // Warning 2264: (0-29): Experimental features are turned on. Do not use experimental features on live deployments. diff --git a/test/libsolidity/syntaxTests/experimental/inference/polymorphic_function_call.sol b/test/libsolidity/syntaxTests/experimental/inference/polymorphic_function_call.sol index c9c7e01109e7..a6c44c0f31ec 100644 --- a/test/libsolidity/syntaxTests/experimental/inference/polymorphic_function_call.sol +++ b/test/libsolidity/syntaxTests/experimental/inference/polymorphic_function_call.sol @@ -11,6 +11,7 @@ function run(a: T, b: U(T), c: U(U(T))) { f(b, b, c); } // ==== +// experimental: true // EVMVersion: >=constantinople // compileViaYul: true // ---- diff --git a/test/libsolidity/syntaxTests/experimental/inference/polymorphic_function_call_let_polymorphism.sol b/test/libsolidity/syntaxTests/experimental/inference/polymorphic_function_call_let_polymorphism.sol index 1a43d0807ac2..159796a2bef7 100644 --- a/test/libsolidity/syntaxTests/experimental/inference/polymorphic_function_call_let_polymorphism.sol +++ b/test/libsolidity/syntaxTests/experimental/inference/polymorphic_function_call_let_polymorphism.sol @@ -13,6 +13,7 @@ function run(a: T, b: U) { g(b); } // ==== +// experimental: true // EVMVersion: >=constantinople // ---- // Warning 2264: (0-29): Experimental features are turned on. Do not use experimental features on live deployments. diff --git a/test/libsolidity/syntaxTests/experimental/inference/polymorphic_function_call_type_mismatch.sol b/test/libsolidity/syntaxTests/experimental/inference/polymorphic_function_call_type_mismatch.sol index 74f102a88183..433a74c4b9d8 100644 --- a/test/libsolidity/syntaxTests/experimental/inference/polymorphic_function_call_type_mismatch.sol +++ b/test/libsolidity/syntaxTests/experimental/inference/polymorphic_function_call_type_mismatch.sol @@ -10,6 +10,7 @@ function run(a: T(V)) { f(a); } // ==== +// experimental: true // EVMVersion: >=constantinople // ---- // Warning 2264: (0-29): Experimental features are turned on. Do not use experimental features on live deployments. diff --git a/test/libsolidity/syntaxTests/experimental/inference/polymorphic_type.sol b/test/libsolidity/syntaxTests/experimental/inference/polymorphic_type.sol index 85f810a9dc0d..88e0da7de34f 100644 --- a/test/libsolidity/syntaxTests/experimental/inference/polymorphic_type.sol +++ b/test/libsolidity/syntaxTests/experimental/inference/polymorphic_type.sol @@ -13,6 +13,7 @@ function run() { let y: T(V, Y, Z: D); } // ==== +// experimental: true // EVMVersion: >=constantinople // compileViaYul: true // ---- diff --git a/test/libsolidity/syntaxTests/experimental/inference/polymorphic_type_abs_and_rep.sol b/test/libsolidity/syntaxTests/experimental/inference/polymorphic_type_abs_and_rep.sol index ebebf6dafc3c..b5311bd1b8e9 100644 --- a/test/libsolidity/syntaxTests/experimental/inference/polymorphic_type_abs_and_rep.sol +++ b/test/libsolidity/syntaxTests/experimental/inference/polymorphic_type_abs_and_rep.sol @@ -18,6 +18,7 @@ function fun() { U.abs(t); } // ==== +// experimental: true // EVMVersion: >=constantinople // compileViaYul: true // ---- diff --git a/test/libsolidity/syntaxTests/experimental/inference/polymorphic_type_instantiation_and_operators.sol b/test/libsolidity/syntaxTests/experimental/inference/polymorphic_type_instantiation_and_operators.sol index c26436e06cca..93323dee03b9 100644 --- a/test/libsolidity/syntaxTests/experimental/inference/polymorphic_type_instantiation_and_operators.sol +++ b/test/libsolidity/syntaxTests/experimental/inference/polymorphic_type_instantiation_and_operators.sol @@ -46,6 +46,7 @@ function fun(a: T(int: P3), b: T(str: P4)) { C.foo(b, b); } // ==== +// experimental: true // EVMVersion: >=constantinople // compileViaYul: true // ---- diff --git a/test/libsolidity/syntaxTests/experimental/inference/type_variable_multi_use_function_parameter_and_return.sol b/test/libsolidity/syntaxTests/experimental/inference/type_variable_multi_use_function_parameter_and_return.sol index 00cd7b1207df..1fe995332fe6 100644 --- a/test/libsolidity/syntaxTests/experimental/inference/type_variable_multi_use_function_parameter_and_return.sol +++ b/test/libsolidity/syntaxTests/experimental/inference/type_variable_multi_use_function_parameter_and_return.sol @@ -10,6 +10,7 @@ function test(t: T, u: U) { t = f(u); } // ==== +// experimental: true // EVMVersion: >=constantinople // ---- // Warning 2264: (0-29): Experimental features are turned on. Do not use experimental features on live deployments. diff --git a/test/libsolidity/syntaxTests/experimental/inference/type_variable_multi_use_function_parameters.sol b/test/libsolidity/syntaxTests/experimental/inference/type_variable_multi_use_function_parameters.sol index 7122cdd9efce..47ccc6754d03 100644 --- a/test/libsolidity/syntaxTests/experimental/inference/type_variable_multi_use_function_parameters.sol +++ b/test/libsolidity/syntaxTests/experimental/inference/type_variable_multi_use_function_parameters.sol @@ -10,6 +10,7 @@ function test(t: T, u: U) { f(t, u); } // ==== +// experimental: true // EVMVersion: >=constantinople // ---- // Warning 2264: (0-29): Experimental features are turned on. Do not use experimental features on live deployments. diff --git a/test/libsolidity/syntaxTests/experimental/parsing/forall_free_function.sol b/test/libsolidity/syntaxTests/experimental/parsing/forall_free_function.sol index ba22a9fae4b4..2b5236f790e5 100644 --- a/test/libsolidity/syntaxTests/experimental/parsing/forall_free_function.sol +++ b/test/libsolidity/syntaxTests/experimental/parsing/forall_free_function.sol @@ -6,6 +6,7 @@ function f(a: A) {} forall (A, B) function g(a: A, b: B) {} // ==== +// experimental: true // EVMVersion: >=constantinople // compileViaYul: true // ---- diff --git a/test/libsolidity/syntaxTests/experimental/parsing/forall_free_function_no_type_var.sol b/test/libsolidity/syntaxTests/experimental/parsing/forall_free_function_no_type_var.sol index 66753fdd0f68..a6f5dd61fbae 100644 --- a/test/libsolidity/syntaxTests/experimental/parsing/forall_free_function_no_type_var.sol +++ b/test/libsolidity/syntaxTests/experimental/parsing/forall_free_function_no_type_var.sol @@ -3,6 +3,7 @@ pragma experimental solidity; forall () function f(x: ()) {} // ==== +// experimental: true // EVMVersion: >=constantinople // compileViaYul: true // ---- diff --git a/test/libsolidity/syntaxTests/experimental/parsing/forall_free_function_with_sorts.sol b/test/libsolidity/syntaxTests/experimental/parsing/forall_free_function_with_sorts.sol index 1ab09fd2bd24..0e69f79b3310 100644 --- a/test/libsolidity/syntaxTests/experimental/parsing/forall_free_function_with_sorts.sol +++ b/test/libsolidity/syntaxTests/experimental/parsing/forall_free_function_with_sorts.sol @@ -9,6 +9,7 @@ function f(a: A: Class1, b: B: Class1) {} forall A: Class1 function g(a: A) {} // ==== +// experimental: true // EVMVersion: >=constantinople // compileViaYul: true // ---- diff --git a/test/libsolidity/syntaxTests/experimental/parsing/forall_type_class.sol b/test/libsolidity/syntaxTests/experimental/parsing/forall_type_class.sol index aa0012eac16f..0dd5b74b5efe 100644 --- a/test/libsolidity/syntaxTests/experimental/parsing/forall_type_class.sol +++ b/test/libsolidity/syntaxTests/experimental/parsing/forall_type_class.sol @@ -3,6 +3,7 @@ pragma experimental solidity; forall (A, B) class Self: C {} // ==== +// experimental: true // EVMVersion: >=constantinople // ---- // ParserError 5709: (45-50): Expected a function definition. diff --git a/test/libsolidity/syntaxTests/experimental/parsing/forall_type_class_instantiation.sol b/test/libsolidity/syntaxTests/experimental/parsing/forall_type_class_instantiation.sol index 31573447a369..5d90e0e32edd 100644 --- a/test/libsolidity/syntaxTests/experimental/parsing/forall_type_class_instantiation.sol +++ b/test/libsolidity/syntaxTests/experimental/parsing/forall_type_class_instantiation.sol @@ -7,6 +7,7 @@ class Self: C {} forall (A, B) instantiation T: C {} // ==== +// experimental: true // EVMVersion: >=constantinople // ---- // ParserError 5709: (72-85): Expected a function definition. diff --git a/test/libsolidity/syntaxTests/pragma/experimental_empty_string_literal.sol b/test/libsolidity/syntaxTests/pragma/experimental_empty_string_literal.sol index 963ef5884b21..c97f464952ce 100644 --- a/test/libsolidity/syntaxTests/pragma/experimental_empty_string_literal.sol +++ b/test/libsolidity/syntaxTests/pragma/experimental_empty_string_literal.sol @@ -1,3 +1,5 @@ pragma experimental ""; +// ==== +// experimental: true // ---- // SyntaxError 3250: (0-23): Empty experimental feature name is invalid. diff --git a/test/libsolidity/syntaxTests/pragma/experimental_multiple_experimental.sol b/test/libsolidity/syntaxTests/pragma/experimental_multiple_experimental.sol index 49fe597ec350..204c4eada0fb 100644 --- a/test/libsolidity/syntaxTests/pragma/experimental_multiple_experimental.sol +++ b/test/libsolidity/syntaxTests/pragma/experimental_multiple_experimental.sol @@ -1,4 +1,6 @@ pragma experimental experimental __test; +// ==== +// experimental: true // ---- // SyntaxError 6022: (0-40): Stray arguments. diff --git a/test/libsolidity/syntaxTests/pragma/experimental_multiple_same_line.sol b/test/libsolidity/syntaxTests/pragma/experimental_multiple_same_line.sol index f88c0e0d8476..f6210a871c06 100644 --- a/test/libsolidity/syntaxTests/pragma/experimental_multiple_same_line.sol +++ b/test/libsolidity/syntaxTests/pragma/experimental_multiple_same_line.sol @@ -1,3 +1,5 @@ pragma experimental unsupportedName unsupportedName; +// ==== +// experimental: true // ---- // SyntaxError 6022: (0-52): Stray arguments. diff --git a/test/libsolidity/syntaxTests/pragma/experimental_pragma_duplicate.sol b/test/libsolidity/syntaxTests/pragma/experimental_pragma_duplicate.sol index 042b5464ce96..caebd64479dd 100644 --- a/test/libsolidity/syntaxTests/pragma/experimental_pragma_duplicate.sol +++ b/test/libsolidity/syntaxTests/pragma/experimental_pragma_duplicate.sol @@ -1,5 +1,7 @@ pragma experimental __test; pragma experimental __test; +// ==== +// experimental: true // ---- // Warning 2264: (0-27): Experimental features are turned on. Do not use experimental features on live deployments. // SyntaxError 1231: (28-55): Duplicate experimental feature name. diff --git a/test/libsolidity/syntaxTests/pragma/experimental_pragma_empty.sol b/test/libsolidity/syntaxTests/pragma/experimental_pragma_empty.sol index d45e7e6afe4b..2360d4e4db9d 100644 --- a/test/libsolidity/syntaxTests/pragma/experimental_pragma_empty.sol +++ b/test/libsolidity/syntaxTests/pragma/experimental_pragma_empty.sol @@ -1,3 +1,5 @@ pragma experimental; +// ==== +// experimental: true // ---- // SyntaxError 9679: (0-20): Experimental feature name is missing. diff --git a/test/libsolidity/syntaxTests/pragma/experimental_pragma_unknown_string_literal.sol b/test/libsolidity/syntaxTests/pragma/experimental_pragma_unknown_string_literal.sol index 76be60ce8a67..4a52ec831d05 100644 --- a/test/libsolidity/syntaxTests/pragma/experimental_pragma_unknown_string_literal.sol +++ b/test/libsolidity/syntaxTests/pragma/experimental_pragma_unknown_string_literal.sol @@ -1,3 +1,5 @@ pragma experimental unsupportedName; +// ==== +// experimental: true // ---- // SyntaxError 8491: (0-36): Unsupported experimental feature name. diff --git a/test/libsolidity/syntaxTests/pragma/experimental_pragma_without_experimental_mode.sol b/test/libsolidity/syntaxTests/pragma/experimental_pragma_without_experimental_mode.sol new file mode 100644 index 000000000000..d5ba45b701aa --- /dev/null +++ b/test/libsolidity/syntaxTests/pragma/experimental_pragma_without_experimental_mode.sol @@ -0,0 +1,4 @@ +pragma experimental __test; +// ---- +// SyntaxError 2816: (0-27): Experimental pragmas can only be used if the experimental mode has been enabled. +// Warning 2264: (0-27): Experimental features are turned on. Do not use experimental features on live deployments. diff --git a/test/libsolidity/syntaxTests/pragma/experimental_test_warning.sol b/test/libsolidity/syntaxTests/pragma/experimental_test_warning.sol index 31f46fbb8f4c..2706c2f31522 100644 --- a/test/libsolidity/syntaxTests/pragma/experimental_test_warning.sol +++ b/test/libsolidity/syntaxTests/pragma/experimental_test_warning.sol @@ -1,3 +1,5 @@ pragma experimental __test; +// ==== +// experimental: true // ---- // Warning 2264: (0-27): Experimental features are turned on. Do not use experimental features on live deployments. diff --git a/test/libsolidity/syntaxTests/pragma/experimental_unknown_number_literal.sol b/test/libsolidity/syntaxTests/pragma/experimental_unknown_number_literal.sol index f8e8267a0d78..4329b387b929 100644 --- a/test/libsolidity/syntaxTests/pragma/experimental_unknown_number_literal.sol +++ b/test/libsolidity/syntaxTests/pragma/experimental_unknown_number_literal.sol @@ -1,3 +1,5 @@ pragma experimental 123; +// ==== +// experimental: true // ---- // SyntaxError 8491: (0-24): Unsupported experimental feature name. diff --git a/test/libsolidity/syntaxTests/pragma/experimental_unknown_quoted_string_literal.sol b/test/libsolidity/syntaxTests/pragma/experimental_unknown_quoted_string_literal.sol index a08a0489b208..9c6927510749 100644 --- a/test/libsolidity/syntaxTests/pragma/experimental_unknown_quoted_string_literal.sol +++ b/test/libsolidity/syntaxTests/pragma/experimental_unknown_quoted_string_literal.sol @@ -1,3 +1,5 @@ pragma experimental "unsupportedName"; +// ==== +// experimental: true // ---- // SyntaxError 8491: (0-38): Unsupported experimental feature name. diff --git a/test/lsp.py b/test/lsp.py index 11007ae822ec..266a29fcc86b 100755 --- a/test/lsp.py +++ b/test/lsp.py @@ -882,7 +882,12 @@ def main(self) -> int: title: str = test_fn.__name__[5:] print(f"{SGR_TEST_BEGIN}Testing {title} ...{SGR_RESET}") try: - with JsonRpcProcess(self.solc_path, ["--lsp"], trace_io=self.trace_io, print_pid=self.print_solc_pid) as solc: + with JsonRpcProcess( + self.solc_path, + ["--experimental", "--lsp"], + trace_io=self.trace_io, + print_pid=self.print_solc_pid + ) as solc: test_fn(solc) self.test_counter.passed += 1 except ExpectationFailed: diff --git a/test/solc/CommandLineInterface.cpp b/test/solc/CommandLineInterface.cpp index adfd24b02b26..d1c43be5bd6e 100644 --- a/test/solc/CommandLineInterface.cpp +++ b/test/solc/CommandLineInterface.cpp @@ -1534,61 +1534,62 @@ BOOST_AUTO_TEST_CASE(cli_ethdebug_debug_info_ethdebug) createFilesWithParentDirs({tempDir.path() / "input.yul"}, "{}"); static std::vector> erroneousCLIFlagCombinations{ { - {"solc", "--debug-info", "ethdebug", tempDir.path().string() + "/input.sol"}, + {"solc", "--experimental", "--debug-info", "ethdebug", tempDir.path().string() + "/input.sol"}, }, { - {"solc", "--debug-info", "ethdebug", "--ir-optimized", tempDir.path().string() + "/input.sol"}, + {"solc", "--experimental", "--debug-info", "ethdebug", "--ir-optimized", tempDir.path().string() + "/input.sol"}, }, { - {"solc", "--debug-info", "ethdebug", "--optimize", tempDir.path().string() + "/input.sol"}, + {"solc", "--experimental", "--debug-info", "ethdebug", "--optimize", tempDir.path().string() + "/input.sol"}, }, { - {"solc", "--debug-info", "ethdebug", "--ethdebug", tempDir.path().string() + "/input.sol"}, + {"solc", "--experimental", "--debug-info", "ethdebug", "--ethdebug", tempDir.path().string() + "/input.sol"}, }, { - {"solc", "--ethdebug-runtime", "--strict-assembly", tempDir.path().string() + "/input.yul"}, + {"solc", "--experimental", "--ethdebug-runtime", "--strict-assembly", tempDir.path().string() + "/input.yul"}, }, { - {"solc", "--ethdebug", "--ethdebug-runtime", "--strict-assembly", tempDir.path().string() + "/input.yul"}, + {"solc", "--experimental", "--ethdebug", "--ethdebug-runtime", "--strict-assembly", tempDir.path().string() + "/input.yul"}, }, { - {"solc", "--debug-info", "ethdebug", "--ethdebug", tempDir.path().string() + "/input.sol"}, + {"solc", "--experimental", "--debug-info", "ethdebug", "--ethdebug", tempDir.path().string() + "/input.sol"}, }, { - {"solc", "--debug-info", "ethdebug", "--ethdebug-runtime", tempDir.path().string() + "/input.sol"}, + {"solc", "--experimental", "--debug-info", "ethdebug", "--ethdebug-runtime", tempDir.path().string() + "/input.sol"}, }, { - {"solc", "--debug-info", "ethdebug", "--ethdebug", "--ethdebug-runtime", tempDir.path().string() + "/input.sol"}, + {"solc", "--experimental", "--debug-info", "ethdebug", "--ethdebug", "--ethdebug-runtime", tempDir.path().string() + "/input.sol"}, }, { - {"solc", "--debug-info", "location", "--ethdebug", "--via-ir", tempDir.path().string() + "/input.sol"}, + {"solc", "--experimental", "--debug-info", "location", "--ethdebug", "--via-ir", tempDir.path().string() + "/input.sol"}, }, { - {"solc", "--debug-info", "location", "--ethdebug-runtime", "--via-ir", tempDir.path().string() + "/input.sol"}, + {"solc", "--experimental", "--debug-info", "location", "--ethdebug-runtime", "--via-ir", tempDir.path().string() + "/input.sol"}, }, { - {"solc", "--debug-info", "location", "--ethdebug", "--ethdebug-runtime", "--via-ir", tempDir.path().string() + "/input.sol"}, + {"solc", "--experimental", "--debug-info", "location", "--ethdebug", "--ethdebug-runtime", "--via-ir", tempDir.path().string() + "/input.sol"}, }, { - {"solc", "--debug-info", "all", "--ethdebug", "--via-ir", tempDir.path().string() + "/input.sol"}, + {"solc", "--experimental", "--debug-info", "all", "--ethdebug", "--via-ir", tempDir.path().string() + "/input.sol"}, }, { - {"solc", "--debug-info", "all", "--ethdebug-runtime", "--via-ir", tempDir.path().string() + "/input.sol"}, + {"solc", "--experimental", "--debug-info", "all", "--ethdebug-runtime", "--via-ir", tempDir.path().string() + "/input.sol"}, }, { - {"solc", "--debug-info", "all", "--ethdebug", "--ethdebug-runtime", "--via-ir", tempDir.path().string() + "/input.sol"}, + {"solc", "--experimental", "--debug-info", "all", "--ethdebug", "--ethdebug-runtime", "--via-ir", tempDir.path().string() + "/input.sol"}, }, }; static std::vector> supportedCLIFlagCombinations{ { - {"solc", "--debug-info", "ethdebug", "--ir", tempDir.path().string() + "/input.sol"}, + {"solc", "--experimental", "--debug-info", "ethdebug", "--ir", tempDir.path().string() + "/input.sol"}, }, { - {"solc", "--debug-info", "ethdebug", "--ethdebug", "--via-ir", tempDir.path().string() + "/input.sol"}, + {"solc", "--experimental", "--debug-info", "ethdebug", "--ethdebug", "--via-ir", tempDir.path().string() + "/input.sol"}, }, { { "solc", + "--experimental", "--debug-info", "ethdebug", "--ethdebug-runtime", @@ -1597,14 +1598,15 @@ BOOST_AUTO_TEST_CASE(cli_ethdebug_debug_info_ethdebug) }, }, { - {"solc", "--debug-info", "ethdebug", "--strict-assembly", tempDir.path().string() + "/input.yul"}, + {"solc", "--experimental", "--debug-info", "ethdebug", "--strict-assembly", tempDir.path().string() + "/input.yul"}, }, { - {"solc", "--ethdebug", "--strict-assembly", tempDir.path().string() + "/input.yul"}, + {"solc", "--experimental", "--ethdebug", "--strict-assembly", tempDir.path().string() + "/input.yul"}, }, { { "solc", + "--experimental", "--debug-info", "ethdebug", "--ethdebug", @@ -1633,11 +1635,12 @@ BOOST_AUTO_TEST_CASE(cli_ethdebug_ethdebug_output) createFilesWithParentDirs({tempDir.path() / "input.sol"}, "pragma solidity >=0.0; contract C { function f() public pure {} }"); static std::vector> erroneousCLIFlagCombinations{ { - {"solc", "--ethdebug", "--ethdebug-runtime", "--via-ir", "--ir-optimized", "--optimize", tempDir.path().string() + "/input.sol"}, + {"solc", "--experimental", "--ethdebug", "--ethdebug-runtime", "--via-ir", "--ir-optimized", "--optimize", tempDir.path().string() + "/input.sol"}, }, { { "solc", + "--experimental", "--ethdebug-runtime", "--via-ir", "--ir-optimized", @@ -1646,42 +1649,42 @@ BOOST_AUTO_TEST_CASE(cli_ethdebug_ethdebug_output) }, }, { - {"solc", "--ethdebug", "--via-ir", "--ir-optimized", "--optimize", tempDir.path().string() + "/input.sol"}, + {"solc", "--experimental", "--ethdebug", "--via-ir", "--ir-optimized", "--optimize", tempDir.path().string() + "/input.sol"}, }, { - {"solc", "--ethdebug", tempDir.path().string() + "/input.sol"}, + {"solc", "--experimental", "--ethdebug", tempDir.path().string() + "/input.sol"}, }, { - {"solc", "--ethdebug", "--ethdebug-runtime", tempDir.path().string() + "/input.sol"}, + {"solc", "--experimental", "--ethdebug", "--ethdebug-runtime", tempDir.path().string() + "/input.sol"}, }, { - {"solc", "--ethdebug-runtime", tempDir.path().string() + "/input.sol"}, + {"solc", "--experimental", "--ethdebug-runtime", tempDir.path().string() + "/input.sol"}, }, }; static std::vector> supportedCLIFlagCombinations{ { - {"solc", "--ethdebug", "--via-ir", tempDir.path().string() + "/input.sol"}, + {"solc", "--experimental", "--ethdebug", "--via-ir", tempDir.path().string() + "/input.sol"}, }, { - {"solc", "--ethdebug-runtime", "--via-ir", tempDir.path().string() + "/input.sol"}, + {"solc", "--experimental", "--ethdebug-runtime", "--via-ir", tempDir.path().string() + "/input.sol"}, }, { - {"solc", "--ethdebug", "--ethdebug-runtime", "--via-ir", tempDir.path().string() + "/input.sol"}, + {"solc", "--experimental", "--ethdebug", "--ethdebug-runtime", "--via-ir", tempDir.path().string() + "/input.sol"}, }, { - {"solc", "--ethdebug", "--via-ir", "--ir", tempDir.path().string() + "/input.sol"}, + {"solc", "--experimental", "--ethdebug", "--via-ir", "--ir", tempDir.path().string() + "/input.sol"}, }, { - {"solc", "--ethdebug-runtime", "--via-ir", "--ir", tempDir.path().string() + "/input.sol"}, + {"solc", "--experimental", "--ethdebug-runtime", "--via-ir", "--ir", tempDir.path().string() + "/input.sol"}, }, { - {"solc", "--ethdebug", "--ethdebug-runtime", "--via-ir", "--ir", tempDir.path().string() + "/input.sol"}, + {"solc", "--experimental", "--ethdebug", "--ethdebug-runtime", "--via-ir", "--ir", tempDir.path().string() + "/input.sol"}, }, { - {"solc", "--ethdebug", "--via-ir", "--ir-optimized", tempDir.path().string() + "/input.sol"}, + {"solc", "--experimental", "--ethdebug", "--via-ir", "--ir-optimized", tempDir.path().string() + "/input.sol"}, }, { - {"solc", "--ethdebug-runtime", "--via-ir", "--ir-optimized", tempDir.path().string() + "/input.sol"}, + {"solc", "--experimental", "--ethdebug-runtime", "--via-ir", "--ir-optimized", tempDir.path().string() + "/input.sol"}, }, }; diff --git a/test/solc/CommandLineParser.cpp b/test/solc/CommandLineParser.cpp index 85eeaebe31a8..952b45901d1a 100644 --- a/test/solc/CommandLineParser.cpp +++ b/test/solc/CommandLineParser.cpp @@ -110,6 +110,7 @@ BOOST_AUTO_TEST_CASE(cli_mode_options) "/tmp=/usr/lib/", "a:b=c/d", ":contract.sol=", + "--experimental", "--base-path=/home/user/", "--include-path=/usr/lib/include/", "--include-path=/home/user/include", @@ -249,7 +250,7 @@ BOOST_AUTO_TEST_CASE(no_import_callback) {"solc", "--standard-json", "--no-import-callback", "input.json"}, {"solc", "--assemble", "--no-import-callback", "input.yul"}, {"solc", "--strict-assembly", "--no-import-callback", "input.yul"}, - {"solc", "--import-ast", "--no-import-callback", "ast.json"}, + {"solc", "--experimental", "--import-ast", "--no-import-callback", "ast.json"}, {"solc", "--link", "--no-import-callback", "input.bin"}, }; @@ -482,6 +483,8 @@ BOOST_AUTO_TEST_CASE(optimizer_flags) for (auto const& [optimizerFlags, expectedOptimizerSettings]: settingsMap) { std::vector commandLine = {"solc", inputModeFlag, "file"}; + if (inputMode == InputMode::CompilerWithASTImport) + commandLine.emplace_back("--experimental"); commandLine += optimizerFlags; BOOST_CHECK(parseCommandLine(commandLine).optimiserSettings() == expectedOptimizerSettings); } @@ -630,34 +633,34 @@ BOOST_AUTO_TEST_CASE(invalid_optimizer_sequence_without_optimize) BOOST_AUTO_TEST_CASE(ethdebug) { - CommandLineOptions commandLineOptions = parseCommandLine({"solc", "contract.sol", "--debug-info", "ethdebug", "--ethdebug", "--via-ir"}); + CommandLineOptions commandLineOptions = parseCommandLine({"solc", "contract.sol", "--experimental", "--debug-info", "ethdebug", "--ethdebug", "--via-ir"}); BOOST_CHECK_EQUAL(commandLineOptions.compiler.outputs.ethdebug, true); BOOST_CHECK_EQUAL(commandLineOptions.compiler.outputs.ethdebugRuntime, false); BOOST_CHECK_EQUAL(commandLineOptions.output.debugInfoSelection.has_value(), true); BOOST_CHECK_EQUAL(commandLineOptions.output.debugInfoSelection->ethdebug, true); - commandLineOptions = parseCommandLine({"solc", "contract.sol", "--debug-info", "ethdebug", "--ethdebug-runtime", "--via-ir"}); + commandLineOptions = parseCommandLine({"solc", "contract.sol", "--experimental", "--debug-info", "ethdebug", "--ethdebug-runtime", "--via-ir"}); BOOST_CHECK_EQUAL(commandLineOptions.compiler.outputs.ethdebug, false); BOOST_CHECK_EQUAL(commandLineOptions.compiler.outputs.ethdebugRuntime, true); BOOST_CHECK_EQUAL(commandLineOptions.output.debugInfoSelection.has_value(), true); BOOST_CHECK_EQUAL(commandLineOptions.output.debugInfoSelection->ethdebug, true); - commandLineOptions = parseCommandLine({"solc", "contract.sol", "--ethdebug", "--via-ir"}); + commandLineOptions = parseCommandLine({"solc", "contract.sol", "--experimental", "--ethdebug", "--via-ir"}); BOOST_CHECK_EQUAL(commandLineOptions.compiler.outputs.ethdebug, true); BOOST_CHECK_EQUAL(commandLineOptions.compiler.outputs.ethdebugRuntime, false); // debug-info "ethdebug" selected implicitly, // if compiled with --ethdebug or --ethdebug-runtime and no debug-info was selected. BOOST_CHECK_EQUAL(commandLineOptions.output.debugInfoSelection.has_value(), true); BOOST_CHECK_EQUAL(commandLineOptions.output.debugInfoSelection->ethdebug, true); - commandLineOptions = parseCommandLine({"solc", "contract.sol", "--ethdebug-runtime", "--via-ir"}); + commandLineOptions = parseCommandLine({"solc", "contract.sol", "--experimental", "--ethdebug-runtime", "--via-ir"}); BOOST_CHECK_EQUAL(commandLineOptions.compiler.outputs.ethdebug, false); BOOST_CHECK_EQUAL(commandLineOptions.compiler.outputs.ethdebugRuntime, true); BOOST_CHECK_EQUAL(commandLineOptions.output.debugInfoSelection.has_value(), true); BOOST_CHECK_EQUAL(commandLineOptions.output.debugInfoSelection->ethdebug, true); - commandLineOptions = parseCommandLine({"solc", "contract.sol", "--ethdebug", "--ethdebug-runtime", "--via-ir"}); + commandLineOptions = parseCommandLine({"solc", "contract.sol", "--experimental", "--ethdebug", "--ethdebug-runtime", "--via-ir"}); BOOST_CHECK_EQUAL(commandLineOptions.compiler.outputs.ethdebug, true); BOOST_CHECK_EQUAL(commandLineOptions.compiler.outputs.ethdebugRuntime, true); BOOST_CHECK_EQUAL(commandLineOptions.output.debugInfoSelection.has_value(), true); BOOST_CHECK_EQUAL(commandLineOptions.output.debugInfoSelection->ethdebug, true); - commandLineOptions = parseCommandLine({"solc", "contract.sol", "--debug-info", "ethdebug", "--ir"}); + commandLineOptions = parseCommandLine({"solc", "contract.sol", "--experimental", "--debug-info", "ethdebug", "--ir"}); BOOST_CHECK_EQUAL(commandLineOptions.compiler.outputs.ethdebug, false); BOOST_CHECK_EQUAL(commandLineOptions.compiler.outputs.ethdebugRuntime, false); BOOST_CHECK_EQUAL(commandLineOptions.compiler.outputs.ir, true); @@ -665,6 +668,58 @@ BOOST_AUTO_TEST_CASE(ethdebug) BOOST_CHECK_EQUAL(commandLineOptions.output.debugInfoSelection->ethdebug, true); } +BOOST_AUTO_TEST_CASE(experimental_features_without_experimental_flag) +{ + std::vector const experimentalFeatures { + "--lsp", + "--import-ast", + "--import-asm-json", + "--ir-ast-json", + "--ir-optimized-ast-json", + "--yul-cfg-json", + "--ethdebug", + "--ethdebug-runtime" + }; + + std::string const expectedErrorMessage { + "The following options are only available in experimental mode: --lsp, --import-ast, --import-asm-json, " + "--ir-ast-json, --ir-optimized-ast-json, --yul-cfg-json, --ethdebug, --ethdebug-runtime, --experimental-eof-version. " + "To toggle experimental mode, use the --experimental flag." + }; + + auto hasCorrectMessage = [&](CommandLineValidationError const& _exception) { return _exception.what() == expectedErrorMessage; }; + + for (auto const& experimentalFeature: experimentalFeatures) + { + std::vector const commandLineOptions{"solc", experimentalFeature, "contract.sol"}; + BOOST_CHECK_EXCEPTION(parseCommandLine(commandLineOptions), CommandLineValidationError, hasCorrectMessage); + } + + std::vector const commandLineOptions{"solc", "--experimental-eof-version", "1", "contract.sol"}; + BOOST_CHECK_EXCEPTION(parseCommandLine(commandLineOptions), CommandLineValidationError, hasCorrectMessage); +} + +BOOST_AUTO_TEST_CASE(debug_info_ethdebug_without_experimental_flag) +{ + std::string const expectedErrorMessage { "--debug-info ethdebug can only be used by toggling the --experimental flag." }; + auto hasCorrectMessage = [&](CommandLineValidationError const& _exception) { return _exception.what() == expectedErrorMessage; }; + + std::vector const commandLineOptions{"solc", "--debug-info", "ethdebug", "contract.sol"}; + BOOST_CHECK_EXCEPTION(parseCommandLine(commandLineOptions), CommandLineValidationError, hasCorrectMessage); +} + +BOOST_AUTO_TEST_CASE(experimental_flag_with_standard_json) +{ + std::string const expectedErrorMessage { + "Standard JSON input mode is incompatible with the --experimental flag. " + "Please use the appropriate experimental option in your Standard JSON input file to enable experimental mode." + }; + auto hasCorrectMessage = [&](CommandLineValidationError const& _exception) { return _exception.what() == expectedErrorMessage; }; + + std::vector const commandLineOptions{"solc", "--experimental", "--standard-json", "input.json"}; + BOOST_CHECK_EXCEPTION(parseCommandLine(commandLineOptions), CommandLineValidationError, hasCorrectMessage); +} + BOOST_AUTO_TEST_SUITE_END() } // namespace solidity::frontend::test