From f599e3184cf8a106b9e08cae8594930ff4d4d8ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Marjam=C3=A4ki?= Date: Sat, 14 Dec 2013 11:12:48 +0100 Subject: [PATCH] Fixed #5174 (Tokenizer: member function 'abort' returns) --- lib/tokenize.cpp | 5 +++-- test/testsimplifytokens.cpp | 21 +++++++++++++++++++++ 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/lib/tokenize.cpp b/lib/tokenize.cpp index 3ad47e0cb..2c00a0449 100644 --- a/lib/tokenize.cpp +++ b/lib/tokenize.cpp @@ -3953,7 +3953,6 @@ void Tokenizer::simplifyEmptyNamespaces() void Tokenizer::simplifyFlowControl() { - for (Token *begin = list.front(); begin; begin = begin->next()) { if (begin->str() == "(" || begin->str() == "[" || @@ -4000,7 +3999,9 @@ void Tokenizer::simplifyFlowControl() eraseDeadCode(tok, 0); } else if (Token::Match(tok,"return|goto") || - Token::Match(tok,"exit|abort") || + Token::Match(tok->previous(), "[;{}] exit (") || + (Token::Match(tok->previous(), "[;{}] %var% (") && + _settings->library.isnoreturn(tok->str())) || (tok->str() == "throw" && !isC())) { //TODO: ensure that we exclude user-defined 'exit|abort|throw', except for 'noreturn' //catch the first ';' diff --git a/test/testsimplifytokens.cpp b/test/testsimplifytokens.cpp index db0ede541..144bc206d 100644 --- a/test/testsimplifytokens.cpp +++ b/test/testsimplifytokens.cpp @@ -452,6 +452,8 @@ private: TEST_CASE(simplifyArrayAddress); // Replace "&str[num]" => "(str + num)" TEST_CASE(simplifyCharAt); TEST_CASE(simplifyOverride); // ticket #5069 + + TEST_CASE(simplifyFlowControl); } std::string tok(const char code[], bool simplify = true, Settings::PlatformType type = Settings::Unspecified) { @@ -8297,6 +8299,25 @@ private: tok(code, true)); } + void simplifyFlowControl() { + const char code1[] = "void f() {\n" + " return;\n" + " y();\n" + "}"; + ASSERT_EQUALS("void f ( ) { return ; }", tok(code1,true)); + + const char code2[] = "void f() {\n" + " exit();\n" + " y();\n" + "}"; + ASSERT_EQUALS("void f ( ) { exit ( ) ; }", tok(code2,true)); + + const char code3[] = "void f() {\n" + " x.abort();\n" + " y();\n" + "}"; + ASSERT_EQUALS("void f ( ) { x . abort ( ) ; y ( ) ; }", tok(code3,true)); + } }; REGISTER_TEST(TestSimplifyTokens)