From 2db0d2878b169658312bbafb859dd5e3dc59c882 Mon Sep 17 00:00:00 2001 From: IOBYTE Date: Fri, 4 Sep 2020 01:08:28 -0400 Subject: [PATCH] fix daca crash in TemplateSimplifier::getNewName (#2772) Don't add the same template instantiation multiple times. Co-authored-by: Robert Reif --- lib/templatesimplifier.cpp | 10 +- test/testsimplifytemplate.cpp | 209 ++++++++++++++++++++++++++++++++++ 2 files changed, 218 insertions(+), 1 deletion(-) diff --git a/lib/templatesimplifier.cpp b/lib/templatesimplifier.cpp index 4065edc6e..8d0bf33b8 100644 --- a/lib/templatesimplifier.cpp +++ b/lib/templatesimplifier.cpp @@ -769,7 +769,15 @@ void TemplateSimplifier::addInstantiation(Token *token, const std::string &scope { simplifyTemplateArgs(token->tokAt(2), token->next()->findClosingBracket()); - mTemplateInstantiations.emplace_back(token, scope); + TokenAndName instantiation(token, scope); + + // check if instantiation already exists before adding it + std::list::iterator it = std::find(mTemplateInstantiations.begin(), + mTemplateInstantiations.end(), + instantiation); + + if (it == mTemplateInstantiations.end()) + mTemplateInstantiations.emplace_back(instantiation); } void TemplateSimplifier::getTemplateInstantiations() diff --git a/test/testsimplifytemplate.cpp b/test/testsimplifytemplate.cpp index 0e7810cec..0dbdb3a7a 100644 --- a/test/testsimplifytemplate.cpp +++ b/test/testsimplifytemplate.cpp @@ -197,6 +197,7 @@ private: TEST_CASE(template155); // #9539 TEST_CASE(template156); TEST_CASE(template157); // #9854 + TEST_CASE(template158); // daca crash TEST_CASE(template_specialization_1); // #7868 - template specialization template struct S> {..}; TEST_CASE(template_specialization_2); // #7868 - template specialization template struct S> {..}; TEST_CASE(template_enum); // #6299 Syntax error in complex enum declaration (including template) @@ -3767,6 +3768,214 @@ private: ASSERT_EQUALS(exp, tok(code)); } + void template158() { // daca crash + const char code[] = "template class a0{};\n" + "template class a1{};\n" + "template class a2{};\n" + "template class a3{};\n" + "template class a4{};\n" + "template class a5{};\n" + "template class a6{};\n" + "template class a7{};\n" + "template class a8{};\n" + "template class a9{};\n" + "template class a10{};\n" + "template class a11{};\n" + "template class a12{};\n" + "template class a13{};\n" + "template class a14{};\n" + "template class a15{};\n" + "template class a16{};\n" + "template class a17{};\n" + "template class a18{};\n" + "template class a19{};\n" + "template class a20{};\n" + "template class a21{};\n" + "template class a22{};\n" + "template class a23{};\n" + "template class a24{};\n" + "template class a25{};\n" + "template class a26{};\n" + "template class a27{};\n" + "template class a28{};\n" + "template class a29{};\n" + "template class a30{};\n" + "template class a31{};\n" + "template class a32{};\n" + "template class a33{};\n" + "template class a34{};\n" + "template class a35{};\n" + "template class a36{};\n" + "template class a37{};\n" + "template class a38{};\n" + "template class a39{};\n" + "template class a40{};\n" + "template class a41{};\n" + "template class a42{};\n" + "template class a43{};\n" + "template class a44{};\n" + "template class a45{};\n" + "template class a46{};\n" + "template class a47{};\n" + "template class a48{};\n" + "template class a49{};\n" + "template class a50{};\n" + "template class a51{};\n" + "template class a52{};\n" + "template class a53{};\n" + "template class a54{};\n" + "template class a55{};\n" + "template class a56{};\n" + "template class a57{};\n" + "template class a58{};\n" + "template class a59{};\n" + "template class a60{};\n" + "template class a61{};\n" + "template class a62{};\n" + "template class a63{};\n" + "template class a64{};\n" + "template class a65{};\n" + "template class a66{};\n" + "template class a67{};\n" + "template class a68{};\n" + "template class a69{};\n" + "template class a70{};\n" + "template class a71{};\n" + "template class a72{};\n" + "template class a73{};\n" + "template class a74{};\n" + "template class a75{};\n" + "template class a76{};\n" + "template class a77{};\n" + "template class a78{};\n" + "template class a79{};\n" + "template class a80{};\n" + "template class a81{};\n" + "template class a82{};\n" + "template class a83{};\n" + "template class a84{};\n" + "template class a85{};\n" + "template class a86{};\n" + "template class a87{};\n" + "template class a88{};\n" + "template class a89{};\n" + "template class a90{};\n" + "template class a91{};\n" + "template class a92{};\n" + "template class a93{};\n" + "template class a94{};\n" + "template class a95{};\n" + "template class a96{};\n" + "template class a97{};\n" + "template class a98{};\n" + "template class a99{};\n" + "template class a100{};\n" + "template class b {};\n" + "b> d0;\n" + "b> d1;\n" + "b> d2;\n" + "b> d3;\n" + "b> d4;\n" + "b> d5;\n" + "b> d6;\n" + "b> d7;\n" + "b> d8;\n" + "b> d9;\n" + "b> d10;\n" + "b> d11;\n" + "b> d12;\n" + "b> d13;\n" + "b> d14;\n" + "b> d15;\n" + "b> d16;\n" + "b> d17;\n" + "b> d18;\n" + "b> d19;\n" + "b> d20;\n" + "b> d21;\n" + "b> d22;\n" + "b> d23;\n" + "b> d24;\n" + "b> d25;\n" + "b> d26;\n" + "b> d27;\n" + "b> d28;\n" + "b> d29;\n" + "b> d30;\n" + "b> d31;\n" + "b> d32;\n" + "b> d33;\n" + "b> d34;\n" + "b> d35;\n" + "b> d36;\n" + "b> d37;\n" + "b> d38;\n" + "b> d39;\n" + "b> d40;\n" + "b> d41;\n" + "b> d42;\n" + "b> d43;\n" + "b> d44;\n" + "b> d45;\n" + "b> d46;\n" + "b> d47;\n" + "b> d48;\n" + "b> d49;\n" + "b> d50;\n" + "b> d51;\n" + "b> d52;\n" + "b> d53;\n" + "b> d54;\n" + "b> d55;\n" + "b> d56;\n" + "b> d57;\n" + "b> d58;\n" + "b> d59;\n" + "b> d60;\n" + "b> d61;\n" + "b> d62;\n" + "b> d63;\n" + "b> d64;\n" + "b> d65;\n" + "b> d66;\n" + "b> d67;\n" + "b> d68;\n" + "b> d69;\n" + "b> d70;\n" + "b> d71;\n" + "b> d72;\n" + "b> d73;\n" + "b> d74;\n" + "b> d75;\n" + "b> d76;\n" + "b> d77;\n" + "b> d78;\n" + "b> d79;\n" + "b> d80;\n" + "b> d81;\n" + "b> d82;\n" + "b> d83;\n" + "b> d84;\n" + "b> d85;\n" + "b> d86;\n" + "b> d87;\n" + "b> d88;\n" + "b> d89;\n" + "b> d90;\n" + "b> d91;\n" + "b> d92;\n" + "b> d93;\n" + "b> d94;\n" + "b> d95;\n" + "b> d96;\n" + "b> d97;\n" + "b> d98;\n" + "b> d99;\n" + "b> d100;"; + // don't bother checking the output because this is not instantiated properly + tok(code); // don't crash + } + void template_specialization_1() { // #7868 - template specialization template struct S> {..}; const char code[] = "template struct C {};\n" "template struct S {a};\n"