From b4b09b68b3fb7717d7709b8019a26fdd1cf8298b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludvig=20Gunne=20Lindstr=C3=B6m?= Date: Wed, 22 Jan 2025 18:39:15 +0100 Subject: [PATCH] fix 13452 --- lib/library.cpp | 27 ++++++++++++++++++++++----- test/testlibrary.cpp | 10 +++++----- 2 files changed, 27 insertions(+), 10 deletions(-) diff --git a/lib/library.cpp b/lib/library.cpp index 6872553c791..59994979f7b 100644 --- a/lib/library.cpp +++ b/lib/library.cpp @@ -1339,17 +1339,34 @@ const Library::Container* Library::detectContainerInternal(const Token* const ty const int offset = (withoutStd && startsWith(container.startPattern2, "std :: ")) ? 7 : 0; // If endPattern is undefined, it will always match, but itEndPattern has to be defined. - if (detect != IteratorOnly && container.endPattern.empty()) { - if (!Token::Match(typeStart, container.startPattern2.c_str() + offset)) - continue; - + if (detect != IteratorOnly && container.endPattern.empty() && + Token::Match(typeStart, container.startPattern2.c_str() + offset)) { if (isIterator) *isIterator = false; return &container; } - if (!firstLinkedTok) + if (!firstLinkedTok) { + if (detect != ContainerOnly && !container.itEndPattern.empty()) { + const std::string pattern = container.startPattern + " " + container.itEndPattern; + if (Token::Match(typeStart, pattern.c_str() + offset)) { + if (isIterator) + *isIterator = true; + return &container; + } + } + + if (detect != IteratorOnly && !container.endPattern.empty()) { + const std::string pattern = container.startPattern + " " + container.endPattern; + if (Token::Match(typeStart, pattern.c_str() + offset)) { + if (isIterator) + *isIterator = false; + return &container; + } + } + continue; + } const bool matchedStartPattern = Token::Match(typeStart, container.startPattern2.c_str() + offset); if (!matchedStartPattern) diff --git a/test/testlibrary.cpp b/test/testlibrary.cpp index f167a6de608..0800ffa11c2 100644 --- a/test/testlibrary.cpp +++ b/test/testlibrary.cpp @@ -978,10 +978,10 @@ class TestLibrary : public TestFixture { { const SimpleTokenizer var(*this, "std::F::iterator I;"); ASSERT(!library.detectContainer(var.tokens())); - TODO_ASSERT(library.detectIterator(var.tokens())); + ASSERT(library.detectIterator(var.tokens())); bool isIterator = false; - TODO_ASSERT_EQUALS((intptr_t)&F, 0, (intptr_t)library.detectContainerOrIterator(var.tokens(), &isIterator)); - TODO_ASSERT(isIterator); + ASSERT_EQUALS((intptr_t)&F, (intptr_t)library.detectContainerOrIterator(var.tokens(), &isIterator)); + ASSERT(isIterator); } { @@ -990,8 +990,8 @@ class TestLibrary : public TestFixture { ASSERT(!library.detectIterator(var.tokens())); ASSERT(!library.detectContainerOrIterator(var.tokens())); bool isIterator = false; - TODO_ASSERT_EQUALS((intptr_t)&F, 0, (intptr_t)library.detectContainerOrIterator(var.tokens(), &isIterator, true)); - TODO_ASSERT(isIterator); + ASSERT_EQUALS((intptr_t)&F, (intptr_t)library.detectContainerOrIterator(var.tokens(), &isIterator, true)); + ASSERT(isIterator); } }