Fix BZ #1733663.
This commit is contained in:
parent
3ea942efe5
commit
a0cbaeee24
154
1939.patch
Normal file
154
1939.patch
Normal file
@ -0,0 +1,154 @@
|
|||||||
|
From 025129663032ab6a2c12e529a0a1a96aeca10db7 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Robert Reif <reif@FX6840>
|
||||||
|
Date: Sun, 30 Jun 2019 18:00:28 -0400
|
||||||
|
Subject: [PATCH] template simplifier: consistently handle templates with no
|
||||||
|
arguments
|
||||||
|
|
||||||
|
this fixes daca boost1.67 crashes
|
||||||
|
---
|
||||||
|
lib/templatesimplifier.cpp | 20 ++++++++++----------
|
||||||
|
test/testsimplifytemplate.cpp | 30 ++++++++++++++++++++++++++++++
|
||||||
|
2 files changed, 40 insertions(+), 10 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/lib/templatesimplifier.cpp b/lib/templatesimplifier.cpp
|
||||||
|
index 4a121e642b..0e0423691f 100644
|
||||||
|
--- a/lib/templatesimplifier.cpp
|
||||||
|
+++ b/lib/templatesimplifier.cpp
|
||||||
|
@@ -1048,7 +1048,7 @@ void TemplateSimplifier::useDefaultArgumentValues(TokenAndName &declaration)
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
- if (tok->str() == "<" && templateParameters(tok))
|
||||||
|
+ if (tok->str() == "<" && (tok->strAt(1) == ">" || templateParameters(tok)))
|
||||||
|
++templateParmDepth;
|
||||||
|
|
||||||
|
// end of template parameters?
|
||||||
|
@@ -1101,7 +1101,7 @@ void TemplateSimplifier::useDefaultArgumentValues(TokenAndName &declaration)
|
||||||
|
instantiationArgs[index].push_back(tok1);
|
||||||
|
tok1 = tok1->next();
|
||||||
|
} while (tok1 && tok1 != endLink);
|
||||||
|
- } else if (tok1->str() == "<") {
|
||||||
|
+ } else if (tok1->str() == "<" && (tok1->strAt(1) == ">" || templateParameters(tok1))) {
|
||||||
|
const Token *endLink = tok1->findClosingBracket();
|
||||||
|
do {
|
||||||
|
instantiationArgs[index].push_back(tok1);
|
||||||
|
@@ -1134,7 +1134,7 @@ void TemplateSimplifier::useDefaultArgumentValues(TokenAndName &declaration)
|
||||||
|
const Token *from = (*it)->next();
|
||||||
|
std::stack<Token *> links;
|
||||||
|
while (from && (!links.empty() || indentlevel || !Token::Match(from, ",|>"))) {
|
||||||
|
- if (from->str() == "<")
|
||||||
|
+ if (from->str() == "<" && (from->strAt(1) == ">" || templateParameters(from)))
|
||||||
|
++indentlevel;
|
||||||
|
else if (from->str() == ">")
|
||||||
|
--indentlevel;
|
||||||
|
@@ -1181,7 +1181,7 @@ void TemplateSimplifier::useDefaultArgumentValues(TokenAndName &declaration)
|
||||||
|
}
|
||||||
|
if (Token::Match(tok2, "(|{|["))
|
||||||
|
tok2 = tok2->link();
|
||||||
|
- else if (Token::Match(tok2, "%type% <") && templateParameters(tok2->next())) {
|
||||||
|
+ else if (Token::Match(tok2, "%type% <") && (tok2->strAt(2) == ">" || templateParameters(tok2->next()))) {
|
||||||
|
std::list<TokenAndName>::iterator ti = std::find_if(mTemplateInstantiations.begin(),
|
||||||
|
mTemplateInstantiations.end(),
|
||||||
|
FindToken(tok2));
|
||||||
|
@@ -1346,7 +1346,7 @@ bool TemplateSimplifier::instantiateMatch(const Token *instance, const std::size
|
||||||
|
const Token *tok = instance;
|
||||||
|
unsigned int indentlevel = 0;
|
||||||
|
for (tok = instance; tok && (tok->str() != ">" || indentlevel > 0); tok = tok->next()) {
|
||||||
|
- if (Token::Match(tok, "<|,|(|:: %name% <") && templateParameters(tok->tokAt(2)) > 0)
|
||||||
|
+ if (Token::Match(tok, "<|,|(|:: %name% <") && (tok->strAt(3) == ">" || templateParameters(tok->tokAt(2))))
|
||||||
|
++indentlevel;
|
||||||
|
if (indentlevel > 0 && tok->str() == ">")
|
||||||
|
--indentlevel;
|
||||||
|
@@ -1637,7 +1637,7 @@ void TemplateSimplifier::expandTemplate(
|
||||||
|
typetok = typetok->tokAt(2);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
- if (Token::Match(typetok, "%name% <") && templateParameters(typetok->next()) > 0)
|
||||||
|
+ if (Token::Match(typetok, "%name% <") && (typetok->strAt(2) == ">" || templateParameters(typetok->next())))
|
||||||
|
++typeindentlevel;
|
||||||
|
else if (typeindentlevel > 0 && typetok->str() == ">")
|
||||||
|
--typeindentlevel;
|
||||||
|
@@ -1859,7 +1859,7 @@ void TemplateSimplifier::expandTemplate(
|
||||||
|
if (Token::simpleMatch(typetok, ". . .")) {
|
||||||
|
typetok = typetok->tokAt(2);
|
||||||
|
} else {
|
||||||
|
- if (Token::Match(typetok, "%name% <") && templateParameters(typetok->next()) > 0)
|
||||||
|
+ if (Token::Match(typetok, "%name% <") && (typetok->strAt(2) == ">" || templateParameters(typetok->next())))
|
||||||
|
++typeindentlevel;
|
||||||
|
else if (typeindentlevel > 0 && typetok->str() == ">")
|
||||||
|
--typeindentlevel;
|
||||||
|
@@ -1939,7 +1939,7 @@ void TemplateSimplifier::expandTemplate(
|
||||||
|
typetok = typetok->tokAt(2);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
- if (Token::Match(typetok, "%name% <") && templateParameters(typetok->next()) > 0)
|
||||||
|
+ if (Token::Match(typetok, "%name% <") && (typetok->strAt(2) == ">" || templateParameters(typetok->next())))
|
||||||
|
++typeindentlevel;
|
||||||
|
else if (typeindentlevel > 0 && typetok->str() == ">")
|
||||||
|
--typeindentlevel;
|
||||||
|
@@ -2710,7 +2710,7 @@ std::string TemplateSimplifier::getNewName(
|
||||||
|
typeForNewName.clear();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
- if (Token::Match(tok3->tokAt(-2), "<|,|:: %name% <") && templateParameters(tok3) > 0)
|
||||||
|
+ if (Token::Match(tok3->tokAt(-2), "<|,|:: %name% <") && (tok3->strAt(1) == ">" || templateParameters(tok3)))
|
||||||
|
++indentlevel;
|
||||||
|
else if (indentlevel > 0 && Token::Match(tok3, "> [,>]"))
|
||||||
|
--indentlevel;
|
||||||
|
@@ -2975,7 +2975,7 @@ void TemplateSimplifier::replaceTemplateUsage(
|
||||||
|
const Token *typetok = (!mTypesUsedInTemplateInstantiation.empty()) ? mTypesUsedInTemplateInstantiation[0].token : nullptr;
|
||||||
|
unsigned int indentlevel2 = 0; // indentlevel for tokgt
|
||||||
|
while (tok2 != endToken && (indentlevel2 > 0 || tok2->str() != ">")) {
|
||||||
|
- if (tok2->str() == "<" && templateParameters(tok2) > 0)
|
||||||
|
+ if (tok2->str() == "<" && (tok2->strAt(1) == ">" || templateParameters(tok2)))
|
||||||
|
++indentlevel2;
|
||||||
|
else if (indentlevel2 > 0 && Token::Match(tok2, "> [,>]"))
|
||||||
|
--indentlevel2;
|
||||||
|
diff --git a/test/testsimplifytemplate.cpp b/test/testsimplifytemplate.cpp
|
||||||
|
index c1b3214e2d..bcfcebd03c 100644
|
||||||
|
--- a/test/testsimplifytemplate.cpp
|
||||||
|
+++ b/test/testsimplifytemplate.cpp
|
||||||
|
@@ -157,6 +157,7 @@ class TestSimplifyTemplate : public TestFixture {
|
||||||
|
TEST_CASE(template117);
|
||||||
|
TEST_CASE(template118);
|
||||||
|
TEST_CASE(template119); // #9186
|
||||||
|
+ TEST_CASE(template120);
|
||||||
|
TEST_CASE(template_specialization_1); // #7868 - template specialization template <typename T> struct S<C<T>> {..};
|
||||||
|
TEST_CASE(template_specialization_2); // #7868 - template specialization template <typename T> struct S<C<T>> {..};
|
||||||
|
TEST_CASE(template_enum); // #6299 Syntax error in complex enum declaration (including template)
|
||||||
|
@@ -2819,6 +2820,35 @@ class TestSimplifyTemplate : public TestFixture {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
+ void template120() {
|
||||||
|
+ const char code[] = "template<typename Tuple>\n"
|
||||||
|
+ "struct lambda_context {\n"
|
||||||
|
+ " template<typename Sig> struct result;\n"
|
||||||
|
+ " template<typename This, typename I>\n"
|
||||||
|
+ " struct result<This(terminal, placeholder)> : at<Tuple, I> {};\n"
|
||||||
|
+ "};\n"
|
||||||
|
+ "template<typename T>\n"
|
||||||
|
+ "struct lambda {\n"
|
||||||
|
+ " template<typename Sig> struct result;\n"
|
||||||
|
+ " template<typename This>\n"
|
||||||
|
+ " struct result<This()> : lambda_context<tuple<> > {};\n"
|
||||||
|
+ "};\n"
|
||||||
|
+ "lambda<int> l;";
|
||||||
|
+ const char exp[] = "template < typename Tuple > "
|
||||||
|
+ "struct lambda_context { "
|
||||||
|
+ "template < typename Sig > struct result ; "
|
||||||
|
+ "template < typename This , typename I > "
|
||||||
|
+ "struct result < This ( terminal , placeholder ) > : at < Tuple , I > { } ; "
|
||||||
|
+ "} ; "
|
||||||
|
+ "struct lambda<int> ; "
|
||||||
|
+ "lambda<int> l ; struct lambda<int> { "
|
||||||
|
+ "template < typename Sig > struct result ; "
|
||||||
|
+ "template < typename This > "
|
||||||
|
+ "struct result < This ( ) > : lambda_context < tuple < > > { } ; "
|
||||||
|
+ "} ;";
|
||||||
|
+ ASSERT_EQUALS(exp, tok(code));
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
void template_specialization_1() { // #7868 - template specialization template <typename T> struct S<C<T>> {..};
|
||||||
|
const char code[] = "template <typename T> struct C {};\n"
|
||||||
|
"template <typename T> struct S {a};\n"
|
@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
Name: cppcheck
|
Name: cppcheck
|
||||||
Version: 1.88
|
Version: 1.88
|
||||||
Release: 2%{?dist}
|
Release: 3%{?dist}
|
||||||
Summary: Tool for static C/C++ code analysis
|
Summary: Tool for static C/C++ code analysis
|
||||||
License: GPLv3+
|
License: GPLv3+
|
||||||
URL: http://cppcheck.wiki.sourceforge.net/
|
URL: http://cppcheck.wiki.sourceforge.net/
|
||||||
@ -18,6 +18,9 @@ Patch2: cppcheck-1.87-cfgdir.patch
|
|||||||
# Select python2 explicitly
|
# Select python2 explicitly
|
||||||
Patch3: cppcheck-1.85-htmlreport-python2.patch
|
Patch3: cppcheck-1.85-htmlreport-python2.patch
|
||||||
|
|
||||||
|
# BZ #1733663
|
||||||
|
Patch4: https://github.com/danmar/cppcheck/pull/1939.patch
|
||||||
|
|
||||||
BuildRequires: gcc-c++
|
BuildRequires: gcc-c++
|
||||||
BuildRequires: pcre-devel
|
BuildRequires: pcre-devel
|
||||||
BuildRequires: docbook-style-xsl
|
BuildRequires: docbook-style-xsl
|
||||||
@ -75,6 +78,7 @@ from xml files first generated using cppcheck.
|
|||||||
%patch1 -p1 -b .translations
|
%patch1 -p1 -b .translations
|
||||||
%patch2 -p1 -b .cfgdir
|
%patch2 -p1 -b .cfgdir
|
||||||
%patch3 -p1 -b .python2
|
%patch3 -p1 -b .python2
|
||||||
|
%patch4 -p1 -b .bz1733663
|
||||||
# Make sure bundled tinyxml is not used
|
# Make sure bundled tinyxml is not used
|
||||||
rm -r externals/tinyxml
|
rm -r externals/tinyxml
|
||||||
|
|
||||||
@ -132,6 +136,9 @@ cd objdir-%{_target_platform}/bin
|
|||||||
%{_bindir}/cppcheck-htmlreport
|
%{_bindir}/cppcheck-htmlreport
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Sat Jul 27 2019 Susi Lehtola <jussilehtola@redhat.com> - 1.89-3
|
||||||
|
- Fix BZ #1733663.
|
||||||
|
|
||||||
* Wed Jul 24 2019 Fedora Release Engineering <releng@fedoraproject.org> - 1.88-2
|
* Wed Jul 24 2019 Fedora Release Engineering <releng@fedoraproject.org> - 1.88-2
|
||||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild
|
- Rebuilt for https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user