diff --git a/lib/templatesimplifier.cpp b/lib/templatesimplifier.cpp index fd64af69b..2205b641b 100644 --- a/lib/templatesimplifier.cpp +++ b/lib/templatesimplifier.cpp @@ -663,14 +663,17 @@ void TemplateSimplifier::expandTemplate( if (itype < typeParametersInDeclaration.size()) { unsigned int typeindentlevel = 0; for (const Token *typetok = typesUsedInTemplateInstantiation[itype]; - typetok && (typeindentlevel>0 || !Token::Match(typetok, "[,>]")); + typetok && (typeindentlevel>0 || !Token::Match(typetok, ",|>|>>")); typetok = typetok->next()) { if (Token::Match(typetok, "%var% <") && templateParameters(typetok->next()) > 0) ++typeindentlevel; else if (typeindentlevel > 0 && typetok->str() == ">") --typeindentlevel; - else if (typeindentlevel > 0 && typetok->str() == ">>") - typeindentlevel -= (typeindentlevel > 1) ? 2 : 1; + else if (typeindentlevel > 0 && typetok->str() == ">>") { + if (typeindentlevel == 1) + break; + typeindentlevel -= 2; + } tokenlist.addtoken(typetok, tok3->linenr(), tok3->fileIndex()); } continue; diff --git a/test/testsimplifytokens.cpp b/test/testsimplifytokens.cpp index 7ffd8335b..a11a8dd6f 100644 --- a/test/testsimplifytokens.cpp +++ b/test/testsimplifytokens.cpp @@ -129,6 +129,7 @@ private: TEST_CASE(template35); // #4074 - A<'x'> a; TEST_CASE(template36); // #4310 - passing unknown template instantiation as template argument TEST_CASE(template37); // #4544 - A a; + TEST_CASE(template38); // #4832 - crash on C++11 right angle brackets TEST_CASE(template_unhandled); TEST_CASE(template_default_parameter); TEST_CASE(template_default_type); @@ -2287,6 +2288,20 @@ private: ASSERT_EQUALS("x ( ) ;", tok("x();")); } + void template38() { // #4832 - Crash on C++11 right angle brackets + const char code[] = "template class A {\n" + " T mT;\n" + "public:\n" + " void foo() {}\n" + "};\n" + "\n" + "int main() {\n" + " A> gna1;\n" + " A gna2;\n" + "}\n"; + tok(code); // Don't crash or freeze + } + void template_default_parameter() { { const char code[] = "template \n"