From 36b64d29b9876f4ca33b1e80c43f744daad1d512 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20R=C3=BCth?= Date: Wed, 3 Feb 2021 19:28:49 +0100 Subject: [PATCH] Segfault when parsing an empty extern "C" {} block (#110) extern declaration blocks can be empty: https://en.cppreference.com/w/cpp/language/language_linkage --- src/cpp_language_linkage.cpp | 6 +++++- test/cpp_language_linkage.cpp | 6 +++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/cpp_language_linkage.cpp b/src/cpp_language_linkage.cpp index 7355226..051ce01 100644 --- a/src/cpp_language_linkage.cpp +++ b/src/cpp_language_linkage.cpp @@ -15,7 +15,11 @@ cpp_entity_kind cpp_language_linkage::kind() noexcept bool cpp_language_linkage::is_block() const noexcept { - DEBUG_ASSERT(begin() != end(), detail::assert_handler{}, "empty container"); + if (begin() == end()) + { + // An empty container must be a "block" of the form: extern "C" {} + return true; + } return std::next(begin()) != end(); // more than one entity, so block } diff --git a/test/cpp_language_linkage.cpp b/test/cpp_language_linkage.cpp index dd433a6..4f65ba5 100644 --- a/test/cpp_language_linkage.cpp +++ b/test/cpp_language_linkage.cpp @@ -36,6 +36,10 @@ extern "C++" // yup enum e {}; } +/// extern "C++"{ +/// } +extern "C++" {} + enum f {}; )"; @@ -50,7 +54,7 @@ enum f {}; else REQUIRE(false); }); - REQUIRE(count == 2u); + REQUIRE(count == 3u); // check enums for their correct parent count = test_visit(*file,