Ticket #7942: Don't generate invalid syntax for out of line template class constructors during instantiation.
This commit is contained in:
parent
f5f141ff42
commit
ee05fe7d77
|
@ -818,8 +818,12 @@ void TemplateSimplifier::expandTemplate(
|
||||||
|
|
||||||
// replace name..
|
// replace name..
|
||||||
if (Token::Match(tok3, (name + " !!<").c_str())) {
|
if (Token::Match(tok3, (name + " !!<").c_str())) {
|
||||||
tokenlist.addtoken(newName, tok3->linenr(), tok3->fileIndex());
|
if (Token::Match(tok3->tokAt(-2), "> :: %name% ( )")) {
|
||||||
continue;
|
; // Ticket #7942: Replacing for out-of-line constructors generates invalid syntax
|
||||||
|
} else {
|
||||||
|
tokenlist.addtoken(newName, tok3->linenr(), tok3->fileIndex());
|
||||||
|
continue;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// copy
|
// copy
|
||||||
|
|
|
@ -183,6 +183,7 @@ private:
|
||||||
TEST_CASE(uninitConstVar);
|
TEST_CASE(uninitConstVar);
|
||||||
TEST_CASE(constructors_crash1); // ticket #5641
|
TEST_CASE(constructors_crash1); // ticket #5641
|
||||||
TEST_CASE(classWithOperatorInName);// ticket #2827
|
TEST_CASE(classWithOperatorInName);// ticket #2827
|
||||||
|
TEST_CASE(templateConstructor); // ticket #7942
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -3348,6 +3349,16 @@ private:
|
||||||
"};");
|
"};");
|
||||||
ASSERT_EQUALS("", errout.str());
|
ASSERT_EQUALS("", errout.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void templateConstructor() { // ticket #7942
|
||||||
|
check("template <class T> struct Containter {\n"
|
||||||
|
" Containter();\n"
|
||||||
|
" T* mElements;\n"
|
||||||
|
"};\n"
|
||||||
|
"template <class T> Containter<T>::Containter() : mElements(nullptr) {}\n"
|
||||||
|
"Containter<int> intContainer;");
|
||||||
|
ASSERT_EQUALS("", errout.str());
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
REGISTER_TEST(TestConstructors)
|
REGISTER_TEST(TestConstructors)
|
||||||
|
|
|
@ -184,7 +184,7 @@ private:
|
||||||
const char expected[] = "template < class T > Fred < T > :: Fred ( ) { } " // <- TODO: this should be removed
|
const char expected[] = "template < class T > Fred < T > :: Fred ( ) { } " // <- TODO: this should be removed
|
||||||
"Fred < float > fred ; "
|
"Fred < float > fred ; "
|
||||||
"class Fred < float > { } ; "
|
"class Fred < float > { } ; "
|
||||||
"Fred < float > :: Fred < float > ( ) { }";
|
"Fred < float > :: Fred ( ) { }";
|
||||||
|
|
||||||
ASSERT_EQUALS(expected, tok(code));
|
ASSERT_EQUALS(expected, tok(code));
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue