:bug: fix lexer to properly cope with repeated comments #2330
diff --git a/include/nlohmann/detail/input/lexer.hpp b/include/nlohmann/detail/input/lexer.hpp index 60eb352..b255b9d 100644 --- a/include/nlohmann/detail/input/lexer.hpp +++ b/include/nlohmann/detail/input/lexer.hpp
@@ -1511,7 +1511,7 @@ skip_whitespace(); // ignore comments - if (ignore_comments && current == '/') + while (ignore_comments && current == '/') { if (!scan_comment()) {
diff --git a/single_include/nlohmann/json.hpp b/single_include/nlohmann/json.hpp index 9c66a84..723773d 100644 --- a/single_include/nlohmann/json.hpp +++ b/single_include/nlohmann/json.hpp
@@ -7390,7 +7390,7 @@ skip_whitespace(); // ignore comments - if (ignore_comments && current == '/') + while (ignore_comments && current == '/') { if (!scan_comment()) {
diff --git a/test/src/unit-class_lexer.cpp b/test/src/unit-class_lexer.cpp index 0f544d5..6d4ede8 100644 --- a/test/src/unit-class_lexer.cpp +++ b/test/src/unit-class_lexer.cpp
@@ -241,5 +241,8 @@ CHECK((scan_string("/* true */", true) == json::lexer::token_type::end_of_input)); CHECK((scan_string("/*/**/", true) == json::lexer::token_type::end_of_input)); CHECK((scan_string("/*/* */", true) == json::lexer::token_type::end_of_input)); + + CHECK((scan_string("//\n//\n", true) == json::lexer::token_type::end_of_input)); + CHECK((scan_string("/**//**//**/", true) == json::lexer::token_type::end_of_input)); } }
diff --git a/test/src/unit-regression2.cpp b/test/src/unit-regression2.cpp index d445f06..1f8c527 100644 --- a/test/src/unit-regression2.cpp +++ b/test/src/unit-regression2.cpp
@@ -478,4 +478,11 @@ CHECK(jsonObj["aaaa"] == 11); CHECK(jsonObj["bbb"] == 222); } + + SECTION("issue #2330 - ignore_comment=true fails on multiple consecutive lines starting with comments") + { + std::string ss = "//\n//\n{\n}\n"; + json j = json::parse(ss, nullptr, true, true); + CHECK(j.dump() == "{}"); + } }