Disallowed --error-recovery in Standard json, Assembly and Linker input modes

This commit is contained in:
Midhun07 2021-08-31 22:27:09 +05:30 committed by Kamil Śliwak
parent 1e630fc584
commit b28e5c881e
3 changed files with 31 additions and 29 deletions

View File

@ -17,6 +17,7 @@ Bugfixes:
* Commandline Interface: Fix extra newline character being appended to sources passed through standard input, affecting their hashes.
* Commandline Interface: Report output selection options unsupported by the selected input mode instead of ignoring them.
* Commandline Interface: Don't return zero exit code when writing linked files to disk fails.
* Commandline Interface: Disallow ``--error-recovery`` option outside of the compiler mode.
* SMTChecker: Fix internal error in magic type access (``block``, ``msg``, ``tx``).
* TypeChecker: Fix internal error when using user defined value types in public library functions.
* Yul IR Generator: Do not output empty switches/if-bodies for empty contracts.

View File

@ -898,13 +898,21 @@ bool CommandLineParser::processArgs()
else
m_options.input.mode = InputMode::Compiler;
if (
m_args.count(g_strExperimentalViaIR) > 0 &&
m_options.input.mode != InputMode::Compiler &&
m_options.input.mode != InputMode::CompilerWithASTImport
)
map<string, set<InputMode>> validOptionInputModeCombinations = {
// TODO: This should eventually contain all options.
{g_strErrorRecovery, {InputMode::Compiler, InputMode::CompilerWithASTImport}},
{g_strExperimentalViaIR, {InputMode::Compiler, InputMode::CompilerWithASTImport}},
};
vector<string> invalidOptionsForCurrentInputMode;
for (auto const& [optionName, inputModes]: validOptionInputModeCombinations)
{
serr() << "The option --" << g_strExperimentalViaIR << " is only supported in the compiler mode." << endl;
if (m_args.count(optionName) > 0 && inputModes.count(m_options.input.mode) == 0)
invalidOptionsForCurrentInputMode.push_back(optionName);
}
if (!invalidOptionsForCurrentInputMode.empty())
{
serr() << "The following options are not supported in the current input mode: " << joinOptionNames(invalidOptionsForCurrentInputMode) << endl;
return false;
}

View File

@ -267,7 +267,6 @@ BOOST_AUTO_TEST_CASE(assembly_mode_options)
"--include-path=/home/user/include",
"--allow-paths=/tmp,/home,project,../contracts",
"--ignore-missing",
"--error-recovery", // Ignored in assembly mode
"--overwrite",
"--evm-version=spuriousDragon",
"--revert-strings=strip", // Accepted but has no effect in assembly mode
@ -356,7 +355,6 @@ BOOST_AUTO_TEST_CASE(standard_json_mode_options)
"--include-path=/home/user/include",
"--allow-paths=/tmp,/home,project,../contracts",
"--ignore-missing",
"--error-recovery", // Ignored in Standard JSON mode
"--output-dir=/tmp/out", // Accepted but has no effect in Standard JSON mode
"--overwrite", // Accepted but has no effect in Standard JSON mode
"--evm-version=spuriousDragon", // Ignored in Standard JSON mode
@ -413,30 +411,25 @@ BOOST_AUTO_TEST_CASE(standard_json_mode_options)
BOOST_TEST(parsedOptions.value() == expectedOptions);
}
BOOST_AUTO_TEST_CASE(experimental_via_ir_invalid_input_modes)
BOOST_AUTO_TEST_CASE(invalid_options_input_modes_combinations)
{
static array<string, 5> const inputModeOptions = {
"--assemble",
"--yul",
"--strict-assembly",
"--standard-json",
"--link",
map<string, vector<string>> invalidOptionInputModeCombinations = {
// TODO: This should eventually contain all options.
{"--error-recovery", {"--assemble", "--yul", "--strict-assembly", "--standard-json", "--link"}},
{"--experimental-via-ir", {"--assemble", "--yul", "--strict-assembly", "--standard-json", "--link"}}
};
for (string const& inputModeOption: inputModeOptions)
{
stringstream sout, serr;
vector<string> commandLine = {
"solc",
"--experimental-via-ir",
"file",
inputModeOption,
};
optional<CommandLineOptions> parsedOptions = parseCommandLine(commandLine, sout, serr);
BOOST_TEST(sout.str() == "");
BOOST_TEST(serr.str() == "The option --experimental-via-ir is only supported in the compiler mode.\n");
BOOST_REQUIRE(!parsedOptions.has_value());
}
for (auto const& [optionName, inputModes]: invalidOptionInputModeCombinations)
for (string const& inputMode: inputModes)
{
stringstream sout, serr;
vector<string> commandLine = {"solc", optionName, "file", inputMode};
optional<CommandLineOptions> parsedOptions = parseCommandLine(commandLine, sout, serr);
BOOST_TEST(sout.str() == "");
BOOST_TEST(serr.str() == "The following options are not supported in the current input mode: " + optionName + "\n");
BOOST_REQUIRE(!parsedOptions.has_value());
}
}
BOOST_AUTO_TEST_SUITE_END()