From f82f191e6c39d1ee5d261f78481d9d6586d15c05 Mon Sep 17 00:00:00 2001 From: mo Date: Wed, 5 Aug 2026 17:13:35 +0100 Subject: [PATCH] fix(parser): allow empty final macro arguments (#948) Treat a trailing comma as an empty parameter. --- src/Parser/Parsing/Impl/DefinesStreamProxy.cpp | 3 ++- .../Parsing/Impl/DefinesStreamProxyTests.cpp | 18 ++++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/src/Parser/Parsing/Impl/DefinesStreamProxy.cpp b/src/Parser/Parsing/Impl/DefinesStreamProxy.cpp index 94587865..c2e20fb2 100644 --- a/src/Parser/Parsing/Impl/DefinesStreamProxy.cpp +++ b/src/Parser/Parsing/Impl/DefinesStreamProxy.cpp @@ -933,7 +933,8 @@ void DefinesStreamProxy::ContinueMacroParameters( } else if (state.m_parameter_state == ParameterState::AFTER_COMMA) { - throw ParsingException(CreatePos(line, linePos), "Cannot close macro parameters after comma"); + state.m_parameters.emplace_back(); + state.m_parameter_state = ParameterState::NOT_IN_PARAMETERS; } else { diff --git a/test/ParserTests/Parsing/Impl/DefinesStreamProxyTests.cpp b/test/ParserTests/Parsing/Impl/DefinesStreamProxyTests.cpp index e3f6d65f..a3a77646 100644 --- a/test/ParserTests/Parsing/Impl/DefinesStreamProxyTests.cpp +++ b/test/ParserTests/Parsing/Impl/DefinesStreamProxyTests.cpp @@ -761,6 +761,24 @@ namespace test::parsing::impl::defines_stream_proxy REQUIRE(proxy.Eof()); } + TEST_CASE("DefinesStreamProxy: Ensure can use empty final parameter value in nested macro", "[parsing][parsingstream]") + { + const std::vector lines{ + "#define inner(param1, param2) param1+param2+end", + "#define outer(param1) inner(param1, )", + "outer(begin)", + }; + + MockParserLineStream mockStream(lines); + DefinesStreamProxy proxy(&mockStream); + + ExpectLine(&proxy, 1, ""); + ExpectLine(&proxy, 2, ""); + ExpectLine(&proxy, 3, "begin++end"); + + REQUIRE(proxy.Eof()); + } + TEST_CASE("DefinesStreamProxy: Ensure throws error on unclosed parenthesis in params", "[parsing][parsingstream]") { const std::vector lines{