From 38b2f6b9b099008c974dce5d17162003b2317d92 Mon Sep 17 00:00:00 2001 From: Alexander Mai Date: Sun, 24 Nov 2013 11:07:11 +0100 Subject: [PATCH] Fixed #5168 (segmentation fault (invalid code) in Tokenizer::simplifyVarDecl) --- lib/tokenize.cpp | 2 +- test/testsimplifytokens.cpp | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/lib/tokenize.cpp b/lib/tokenize.cpp index 4f93d6dc4..a020fa2e2 100644 --- a/lib/tokenize.cpp +++ b/lib/tokenize.cpp @@ -3175,7 +3175,7 @@ void Tokenizer::createLinks2() if (token->link()) { if (Token::Match(token, "{|[|(")) type.push(token); - else if (Token::Match(token, "}|]|)")) { + else if (!type.empty() && Token::Match(token, "}|]|)")) { while (type.top()->str() == "<") type.pop(); type.pop(); diff --git a/test/testsimplifytokens.cpp b/test/testsimplifytokens.cpp index b41681f50..db0ede541 100644 --- a/test/testsimplifytokens.cpp +++ b/test/testsimplifytokens.cpp @@ -134,6 +134,7 @@ private: TEST_CASE(template39); // #4742 - freeze TEST_CASE(template40); // #5055 - template specialization outside struct TEST_CASE(template41); // #4710 - const in instantiation not handled perfectly + TEST_CASE(template42); // #4878 - variadic templates TEST_CASE(template_unhandled); TEST_CASE(template_default_parameter); TEST_CASE(template_default_type); @@ -2350,6 +2351,19 @@ private: ASSERT_EQUALS("int x ( ) { return f ( 123 ) ; } int f ( int t ) { return t ; }", tok(code2)); } + void template42() { // #4878 cpcheck aborts in ext-blocks.cpp (clang testcode) + const char code[] = "template\n" + "int f0(Args ...args) {\n" + " return ^ {\n" + " return sizeof...(Args);\n" + " }() + ^ {\n" + " return sizeof...(args);\n" + " }();\n" + "}"; + tok(code); + } + + void template_default_parameter() { { const char code[] = "template \n"