From 6133aba33edb63935de4836c26b3e53dfc128ad2 Mon Sep 17 00:00:00 2001 From: firewave Date: Thu, 14 Apr 2022 10:57:43 +0200 Subject: [PATCH 1/5] test.cpp: also run tests with char buffer --- test.cpp | 38 ++++++++++++++++++++++++++++++++++---- 1 file changed, 34 insertions(+), 4 deletions(-) diff --git a/test.cpp b/test.cpp index fa94a266..2e76d79e 100644 --- a/test.cpp +++ b/test.cpp @@ -6,6 +6,7 @@ #include "simplecpp.h" #include +#include #include #include #include @@ -24,6 +25,13 @@ #define STRINGIZE(x) STRINGIZE_(x) static const std::string testSourceDir = SIMPLECPP_TEST_SOURCE_DIR; + +enum class Input : std::uint8_t { + Stringstream, + CharBuffer +}; + +static Input USE_INPUT = Input::Stringstream; static int numberOfFailedAssertions = 0; #define ASSERT_EQUALS(expected, actual) (assertEquals((expected), (actual), __LINE__)) @@ -40,11 +48,20 @@ static std::string pprint(const std::string &in) return ret; } +static const char* inputString(Input input) { + switch (input) { + case Input::Stringstream: + return "Stringstream"; + case Input::CharBuffer: + return "CharBuffer"; + } +} + static int assertEquals(const std::string &expected, const std::string &actual, int line) { if (expected != actual) { numberOfFailedAssertions++; - std::cerr << "------ assertion failed ---------" << std::endl; + std::cerr << "------ assertion failed (" << inputString(USE_INPUT) << ")---------" << std::endl; std::cerr << "line test.cpp:" << line << std::endl; std::cerr << "expected:" << pprint(expected) << std::endl; std::cerr << "actual:" << pprint(actual) << std::endl; @@ -82,8 +99,14 @@ static void testcase(const std::string &name, void (*f)(), int argc, char * cons static simplecpp::TokenList makeTokenList(const char code[], std::size_t size, std::vector &filenames, const std::string &filename=std::string(), simplecpp::OutputList *outputList=nullptr) { - std::istringstream istr(std::string(code, size)); - return {istr,filenames,filename,outputList}; + switch (USE_INPUT) { + case Input::Stringstream: { + std::istringstream istr(std::string(code, size)); + return {istr,filenames,filename,outputList}; + } + case Input::CharBuffer: + return {{code, size}, filenames, filename, outputList}; + } } static simplecpp::TokenList makeTokenList(const char code[], std::vector &filenames, const std::string &filename=std::string(), simplecpp::OutputList *outputList=nullptr) @@ -3525,8 +3548,10 @@ static void leak() } } -int main(int argc, char **argv) +static void runTests(int argc, char **argv, Input input) { + USE_INPUT = input; + TEST_CASE(backslash); TEST_CASE(builtin); @@ -3793,6 +3818,11 @@ int main(int argc, char **argv) TEST_CASE(fuzz_crash); TEST_CASE(leak); +} +int main(int argc, char **argv) +{ + runTests(argc, argv, Input::Stringstream); + runTests(argc, argv, Input::CharBuffer); return numberOfFailedAssertions > 0 ? EXIT_FAILURE : EXIT_SUCCESS; } From c72ff7566145aa3a6cc46f56809b4fca3f583bf4 Mon Sep 17 00:00:00 2001 From: firewave Date: Thu, 15 Jan 2026 11:23:29 +0100 Subject: [PATCH 2/5] test.cpp: fixed compiler warnings about missing returns after fully covered switch --- test.cpp | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/test.cpp b/test.cpp index 2e76d79e..fa58accc 100644 --- a/test.cpp +++ b/test.cpp @@ -37,6 +37,32 @@ static int numberOfFailedAssertions = 0; #define ASSERT_EQUALS(expected, actual) (assertEquals((expected), (actual), __LINE__)) #define ASSERT_THROW_EQUALS(stmt, e, expected) do { try { stmt; assertThrowFailed(__LINE__); } catch (const e& ex) { assertEquals((expected), (ex.what()), __LINE__); } } while (false) +#ifndef __has_cpp_attribute +#define __has_cpp_attribute(x) 0 +#endif + +#if __has_cpp_attribute (noreturn) \ + || (defined(__GNUC__) && (__GNUC__ >= 5)) \ + || defined(__clang__) \ + || defined(__CPPCHECK__) +# define NORETURN [[noreturn]] +#elif defined(__GNUC__) +# define NORETURN __attribute__((noreturn)) +#else +# define NORETURN +#endif + +NORETURN static void unreachable() +{ +#if defined(__GNUC__) + __builtin_unreachable(); +#elif defined(_MSC_VER) + __assume(false); +#else +# error "no unreachable implementation" +#endif +} + static std::string pprint(const std::string &in) { std::string ret; @@ -55,6 +81,8 @@ static const char* inputString(Input input) { case Input::CharBuffer: return "CharBuffer"; } + + unreachable(); } static int assertEquals(const std::string &expected, const std::string &actual, int line) @@ -107,6 +135,8 @@ static simplecpp::TokenList makeTokenList(const char code[], std::size_t size, s case Input::CharBuffer: return {{code, size}, filenames, filename, outputList}; } + + unreachable(); } static simplecpp::TokenList makeTokenList(const char code[], std::vector &filenames, const std::string &filename=std::string(), simplecpp::OutputList *outputList=nullptr) From 1c398d9ee92e08b8e4ce1ff3e4de764611b20c38 Mon Sep 17 00:00:00 2001 From: firewave Date: Tue, 10 Feb 2026 21:50:51 +0100 Subject: [PATCH 3/5] s --- test.cpp | 36 ++++++------------------------------ 1 file changed, 6 insertions(+), 30 deletions(-) diff --git a/test.cpp b/test.cpp index fa58accc..58098870 100644 --- a/test.cpp +++ b/test.cpp @@ -37,32 +37,6 @@ static int numberOfFailedAssertions = 0; #define ASSERT_EQUALS(expected, actual) (assertEquals((expected), (actual), __LINE__)) #define ASSERT_THROW_EQUALS(stmt, e, expected) do { try { stmt; assertThrowFailed(__LINE__); } catch (const e& ex) { assertEquals((expected), (ex.what()), __LINE__); } } while (false) -#ifndef __has_cpp_attribute -#define __has_cpp_attribute(x) 0 -#endif - -#if __has_cpp_attribute (noreturn) \ - || (defined(__GNUC__) && (__GNUC__ >= 5)) \ - || defined(__clang__) \ - || defined(__CPPCHECK__) -# define NORETURN [[noreturn]] -#elif defined(__GNUC__) -# define NORETURN __attribute__((noreturn)) -#else -# define NORETURN -#endif - -NORETURN static void unreachable() -{ -#if defined(__GNUC__) - __builtin_unreachable(); -#elif defined(_MSC_VER) - __assume(false); -#else -# error "no unreachable implementation" -#endif -} - static std::string pprint(const std::string &in) { std::string ret; @@ -74,6 +48,8 @@ static std::string pprint(const std::string &in) return ret; } +#pragma warning(push) +#pragma warning(disable: 4705) // warning C4715: 'inputString': not all control paths return a value static const char* inputString(Input input) { switch (input) { case Input::Stringstream: @@ -81,9 +57,8 @@ static const char* inputString(Input input) { case Input::CharBuffer: return "CharBuffer"; } - - unreachable(); } +#pragma warning(pop) static int assertEquals(const std::string &expected, const std::string &actual, int line) { @@ -125,6 +100,8 @@ static void testcase(const std::string &name, void (*f)(), int argc, char * cons #define TEST_CASE(F) (testcase(#F, F, argc, argv)) +#pragma warning(push) +#pragma warning(disable: 4705) // warning C4715: 'inputString': not all control paths return a value static simplecpp::TokenList makeTokenList(const char code[], std::size_t size, std::vector &filenames, const std::string &filename=std::string(), simplecpp::OutputList *outputList=nullptr) { switch (USE_INPUT) { @@ -135,9 +112,8 @@ static simplecpp::TokenList makeTokenList(const char code[], std::size_t size, s case Input::CharBuffer: return {{code, size}, filenames, filename, outputList}; } - - unreachable(); } +#pragma warning(pop) static simplecpp::TokenList makeTokenList(const char code[], std::vector &filenames, const std::string &filename=std::string(), simplecpp::OutputList *outputList=nullptr) { From c8a7516a99a94d5eb81ecac136d4713f3705766a Mon Sep 17 00:00:00 2001 From: firewave Date: Tue, 10 Feb 2026 21:51:43 +0100 Subject: [PATCH 4/5] s --- test.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test.cpp b/test.cpp index 58098870..aa7cd170 100644 --- a/test.cpp +++ b/test.cpp @@ -101,7 +101,7 @@ static void testcase(const std::string &name, void (*f)(), int argc, char * cons #define TEST_CASE(F) (testcase(#F, F, argc, argv)) #pragma warning(push) -#pragma warning(disable: 4705) // warning C4715: 'inputString': not all control paths return a value +#pragma warning(disable: 4705) // warning C4715: 'makeTokenList': not all control paths return a value static simplecpp::TokenList makeTokenList(const char code[], std::size_t size, std::vector &filenames, const std::string &filename=std::string(), simplecpp::OutputList *outputList=nullptr) { switch (USE_INPUT) { From 612a0696df25e5c27af56477a7a92cbc1d09c6ea Mon Sep 17 00:00:00 2001 From: firewave Date: Tue, 10 Feb 2026 21:52:43 +0100 Subject: [PATCH 5/5] s --- test.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/test.cpp b/test.cpp index aa7cd170..33eccf5b 100644 --- a/test.cpp +++ b/test.cpp @@ -48,8 +48,10 @@ static std::string pprint(const std::string &in) return ret; } +#ifdef _MSC_VER #pragma warning(push) #pragma warning(disable: 4705) // warning C4715: 'inputString': not all control paths return a value +#endif static const char* inputString(Input input) { switch (input) { case Input::Stringstream: @@ -58,7 +60,9 @@ static const char* inputString(Input input) { return "CharBuffer"; } } +#ifdef _MSC_VER #pragma warning(pop) +#endif static int assertEquals(const std::string &expected, const std::string &actual, int line) { @@ -100,8 +104,10 @@ static void testcase(const std::string &name, void (*f)(), int argc, char * cons #define TEST_CASE(F) (testcase(#F, F, argc, argv)) +#ifdef _MSC_VER #pragma warning(push) #pragma warning(disable: 4705) // warning C4715: 'makeTokenList': not all control paths return a value +#endif static simplecpp::TokenList makeTokenList(const char code[], std::size_t size, std::vector &filenames, const std::string &filename=std::string(), simplecpp::OutputList *outputList=nullptr) { switch (USE_INPUT) { @@ -113,7 +119,9 @@ static simplecpp::TokenList makeTokenList(const char code[], std::size_t size, s return {{code, size}, filenames, filename, outputList}; } } +#ifdef _MSC_VER #pragma warning(pop) +#endif static simplecpp::TokenList makeTokenList(const char code[], std::vector &filenames, const std::string &filename=std::string(), simplecpp::OutputList *outputList=nullptr) {