From eee3b41b5dcfeab3b8ded2bf8060f830de235c52 Mon Sep 17 00:00:00 2001 From: firewave Date: Mon, 11 Sep 2023 09:58:32 +0200 Subject: [PATCH] bail out on unknown `DUI::std` value --- main.cpp | 3 +++ simplecpp.cpp | 13 +++++++++++-- simplecpp.h | 3 ++- test.cpp | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 62 insertions(+), 3 deletions(-) diff --git a/main.cpp b/main.cpp index 6b5b0d0e..3f02773f 100644 --- a/main.cpp +++ b/main.cpp @@ -169,6 +169,9 @@ int main(int argc, char **argv) case simplecpp::Output::FILE_NOT_FOUND: std::cerr << "file not found: "; break; + case simplecpp::Output::DUI_ERROR: + std::cerr << "dui error: "; + break; } std::cerr << output.msg << std::endl; } diff --git a/simplecpp.cpp b/simplecpp.cpp index 47bb78f8..94359877 100755 --- a/simplecpp.cpp +++ b/simplecpp.cpp @@ -3315,8 +3315,17 @@ void simplecpp::preprocess(simplecpp::TokenList &output, const simplecpp::TokenL macros.insert(std::make_pair("__STDC_VERSION__", Macro("__STDC_VERSION__", std_def, dummy))); } else { std_def = simplecpp::getCppStdString(dui.std); - if (!std_def.empty()) - macros.insert(std::make_pair("__cplusplus", Macro("__cplusplus", std_def, dummy))); + if (std_def.empty()) { + if (outputList) { + simplecpp::Output err(files); + err.type = Output::DUI_ERROR; + err.msg = "unknown standard specified: '" + dui.std + "'"; + outputList->push_back(err); + } + output.clear(); + return; + } + macros.insert(std::make_pair("__cplusplus", Macro("__cplusplus", std_def, dummy))); } } diff --git a/simplecpp.h b/simplecpp.h index c72e4c65..f495effd 100755 --- a/simplecpp.h +++ b/simplecpp.h @@ -181,7 +181,8 @@ namespace simplecpp { PORTABILITY_BACKSLASH, UNHANDLED_CHAR_ERROR, EXPLICIT_INCLUDE_NOT_FOUND, - FILE_NOT_FOUND + FILE_NOT_FOUND, + DUI_ERROR } type; explicit Output(const std::vector& files, Type type, const std::string& msg) : type(type), location(files), msg(msg) {} Location location; diff --git a/test.cpp b/test.cpp index 16c5ce06..d00658ad 100644 --- a/test.cpp +++ b/test.cpp @@ -154,6 +154,9 @@ static std::string toString(const simplecpp::OutputList &outputList) case simplecpp::Output::Type::FILE_NOT_FOUND: ostr << "file_not_found,"; break; + case simplecpp::Output::Type::DUI_ERROR: + ostr << "dui_error,"; + break; } ostr << output.msg << '\n'; @@ -2656,6 +2659,48 @@ static void cpluscplusDefine() ASSERT_EQUALS("\n201103L", preprocess(code, dui)); } +static void invalidStd() +{ + const char code[] = ""; + simplecpp::DUI dui; + simplecpp::OutputList outputList; + + dui.std = "c88"; + ASSERT_EQUALS("", preprocess(code, dui, &outputList)); + ASSERT_EQUALS(1, outputList.size()); + ASSERT_EQUALS(simplecpp::Output::Type::DUI_ERROR, outputList.cbegin()->type); + ASSERT_EQUALS("unknown standard specified: 'c88'", outputList.cbegin()->msg); + outputList.clear(); + + dui.std = "gnu88"; + ASSERT_EQUALS("", preprocess(code, dui, &outputList)); + ASSERT_EQUALS(1, outputList.size()); + ASSERT_EQUALS(simplecpp::Output::Type::DUI_ERROR, outputList.cbegin()->type); + ASSERT_EQUALS("unknown standard specified: 'gnu88'", outputList.cbegin()->msg); + outputList.clear(); + + dui.std = "d99"; + ASSERT_EQUALS("", preprocess(code, dui, &outputList)); + ASSERT_EQUALS(1, outputList.size()); + ASSERT_EQUALS(simplecpp::Output::Type::DUI_ERROR, outputList.cbegin()->type); + ASSERT_EQUALS("unknown standard specified: 'd99'", outputList.cbegin()->msg); + outputList.clear(); + + dui.std = "c++77"; + ASSERT_EQUALS("", preprocess(code, dui, &outputList)); + ASSERT_EQUALS(1, outputList.size()); + ASSERT_EQUALS(simplecpp::Output::Type::DUI_ERROR, outputList.cbegin()->type); + ASSERT_EQUALS("unknown standard specified: 'c++77'", outputList.cbegin()->msg); + outputList.clear(); + + dui.std = "gnu++33"; + ASSERT_EQUALS("", preprocess(code, dui, &outputList)); + ASSERT_EQUALS(1, outputList.size()); + ASSERT_EQUALS(simplecpp::Output::Type::DUI_ERROR, outputList.cbegin()->type); + ASSERT_EQUALS("unknown standard specified: 'gnu++33'", outputList.cbegin()->msg); + outputList.clear(); +} + static void assertToken(const std::string& s, bool name, bool number, bool comment, char op, int line) { const std::vector f; @@ -2984,6 +3029,7 @@ int main(int argc, char **argv) TEST_CASE(stdcVersionDefine); TEST_CASE(cpluscplusDefine); + TEST_CASE(invalidStd); TEST_CASE(token);