From 68e6511c87aceccd0ce7efecae63f7c640a37707 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Marjam=C3=A4ki?= Date: Sat, 31 Mar 2012 11:30:26 +0200 Subject: [PATCH] Fixed #3532 (false positive : missing constructor) --- lib/templatesimplifier.cpp | 14 +++++++++----- test/testsimplifytokens.cpp | 6 ++++++ 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/lib/templatesimplifier.cpp b/lib/templatesimplifier.cpp index 359ff5a5e..f85ed2aa9 100644 --- a/lib/templatesimplifier.cpp +++ b/lib/templatesimplifier.cpp @@ -237,6 +237,7 @@ void TemplateSimplifier::removeTemplates(Token *tok) continue; int indentlevel = 0; + unsigned int countgt = 0; // Counter for ">" for (const Token *tok2 = tok->next(); tok2; tok2 = tok2->next()) { if (tok2->str() == "(") { @@ -260,8 +261,14 @@ void TemplateSimplifier::removeTemplates(Token *tok) tok->deleteThis(); break; } + + // Count ">" + if (tok2->str() == ">") + countgt++; + // don't remove constructor - if (tok2->str() == "explicit") { + if (tok2->str() == "explicit" || + (countgt == 1 && Token::Match(tok2->previous(), "> %type% (") && Token::simpleMatch(tok2->next()->link(), ") {"))) { Token::eraseTokens(tok, tok2); tok->deleteThis(); goback = true; @@ -282,10 +289,7 @@ void TemplateSimplifier::removeTemplates(Token *tok) else if (indentlevel >= 2 && tok2->str() == ">") --indentlevel; - else if (indentlevel >= 3 && tok2->str() == ">>") - indentlevel -= 2; - - else if (Token::Match(tok2, ">|>> class|struct %var% [,)]")) { + else if (Token::Match(tok2, "> class|struct %var% [,)]")) { tok2 = tok2->next(); Token::eraseTokens(tok, tok2); tok->deleteThis(); diff --git a/test/testsimplifytokens.cpp b/test/testsimplifytokens.cpp index 228b9c3df..f4908699d 100644 --- a/test/testsimplifytokens.cpp +++ b/test/testsimplifytokens.cpp @@ -2320,6 +2320,12 @@ private: " template explicit Fred(T t) { }\n" "}"; ASSERT_EQUALS("class Fred { explicit Fred ( T t ) { } }", tok(code)); + + // #3532 + const char code2[] = "class Fred {\n" + " template Fred(T t) { }\n" + "}"; + ASSERT_EQUALS("class Fred { Fred ( T t ) { } }", tok(code2)); } void namespaces() {