diff --git a/cli/cmdlineparser.cpp b/cli/cmdlineparser.cpp index 2977313e861..51eded9cb71 100644 --- a/cli/cmdlineparser.cpp +++ b/cli/cmdlineparser.cpp @@ -1261,14 +1261,12 @@ CmdLineParser::Result CmdLineParser::parseFromArgs(int argc, const char* const a // --std else if (std::strncmp(argv[i], "--std=", 6) == 0) { const std::string std = argv[i] + 6; - // TODO: print error when standard is unknown - if (std::strncmp(std.c_str(), "c++", 3) == 0) { - mSettings.standards.cpp = Standards::getCPP(std); - } - else if (std::strncmp(std.c_str(), "c", 1) == 0) { - mSettings.standards.c = Standards::getC(std); - } - else { + Standards tmp; + if (tmp.setC(std)) { + mSettings.standards.c = tmp.c; + } else if (tmp.setCPP(std)) { + mSettings.standards.cpp = tmp.cpp; + } else { mLogger.printError("unknown --std value '" + std + "'"); return Result::Fail; } diff --git a/test/testcmdlineparser.cpp b/test/testcmdlineparser.cpp index 46425aa161f..b174a1aff5d 100644 --- a/test/testcmdlineparser.cpp +++ b/test/testcmdlineparser.cpp @@ -225,6 +225,12 @@ class TestCmdlineParser : public TestFixture { TEST_CASE(stdcpp11); TEST_CASE(stdunknown1); TEST_CASE(stdunknown2); + TEST_CASE(stdoverwrite1); + TEST_CASE(stdoverwrite2); + TEST_CASE(stdoverwrite3); + TEST_CASE(stdoverwrite4); + TEST_CASE(stdmulti1); + TEST_CASE(stdmulti2); TEST_CASE(platformWin64); TEST_CASE(platformWin32A); TEST_CASE(platformWin32W); @@ -1369,8 +1375,56 @@ class TestCmdlineParser : public TestFixture { void stdunknown2() { REDIRECT; const char *const argv[] = {"cppcheck", "--std=cplusplus11", "file.cpp"}; - TODO_ASSERT_EQUALS(static_cast(CmdLineParser::Result::Fail), static_cast(CmdLineParser::Result::Success), static_cast(parser->parseFromArgs(3, argv))); - TODO_ASSERT_EQUALS("cppcheck: error: unknown --std value 'cplusplus11'\n", "", logger->str()); + ASSERT_EQUALS_ENUM(CmdLineParser::Result::Fail, parser->parseFromArgs(3, argv)); + ASSERT_EQUALS("cppcheck: error: unknown --std value 'cplusplus11'\n", logger->str()); + } + + void stdoverwrite1() { + REDIRECT; + const char *const argv[] = {"cppcheck", "--std=c++11", "--std=c++23", "file.cpp"}; + ASSERT_EQUALS_ENUM(CmdLineParser::Result::Success, parser->parseFromArgs(4, argv)); + ASSERT_EQUALS_ENUM(Standards::CPP23, settings->standards.cpp); + ASSERT_EQUALS_ENUM(Standards::CLatest, settings->standards.c); + } + + void stdoverwrite2() { + REDIRECT; + const char *const argv[] = {"cppcheck", "--std=c99", "--std=c11", "file.cpp"}; + ASSERT_EQUALS_ENUM(CmdLineParser::Result::Success, parser->parseFromArgs(4, argv)); + ASSERT_EQUALS_ENUM(Standards::C11, settings->standards.c); + ASSERT_EQUALS_ENUM(Standards::CPPLatest, settings->standards.cpp); + } + + void stdoverwrite3() { + REDIRECT; + const char *const argv[] = {"cppcheck", "--std=c99", "--std=c++11", "--std=c11", "file.cpp"}; + ASSERT_EQUALS_ENUM(CmdLineParser::Result::Success, parser->parseFromArgs(5, argv)); + ASSERT_EQUALS_ENUM(Standards::C11, settings->standards.c); + ASSERT_EQUALS_ENUM(Standards::CPP11, settings->standards.cpp); + } + + void stdoverwrite4() { + REDIRECT; + const char *const argv[] = {"cppcheck", "--std=c++11", "--std=c99", "--std=c++23", "file.cpp"}; + ASSERT_EQUALS_ENUM(CmdLineParser::Result::Success, parser->parseFromArgs(5, argv)); + ASSERT_EQUALS_ENUM(Standards::CPP23, settings->standards.cpp); + ASSERT_EQUALS_ENUM(Standards::C99, settings->standards.c); + } + + void stdmulti1() { + REDIRECT; + const char *const argv[] = {"cppcheck", "--std=c99", "--std=c++11", "file.cpp"}; + ASSERT_EQUALS_ENUM(CmdLineParser::Result::Success, parser->parseFromArgs(4, argv)); + ASSERT_EQUALS_ENUM(Standards::C99, settings->standards.c); + ASSERT_EQUALS_ENUM(Standards::CPP11, settings->standards.cpp); + } + + void stdmulti2() { + REDIRECT; + const char *const argv[] = {"cppcheck", "--std=c++20", "--std=c11", "file.cpp"}; + ASSERT_EQUALS_ENUM(CmdLineParser::Result::Success, parser->parseFromArgs(4, argv)); + ASSERT_EQUALS_ENUM(Standards::C11, settings->standards.c); + ASSERT_EQUALS_ENUM(Standards::CPP20, settings->standards.cpp); } void platformWin64() {