Skip to content

Commit f90a76f

Browse files
authored
Fix #15072: Type aliases not simplified in templates (#8904)
1 parent a294079 commit f90a76f

2 files changed

Lines changed: 43 additions & 1 deletion

File tree

‎lib/tokenize.cpp‎

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3201,8 +3201,15 @@ bool Tokenizer::simplifyUsing()
32013201
continue;
32023202
}
32033203

3204-
// skip template definitions
32053204
if (Token::Match(tok1, "template < !!>")) {
3205+
Token *paramsEnd = tok1->next()->findClosingBracket();
3206+
bool shadowed = !paramsEnd;
3207+
for (const Token *param = tok1->next(); !shadowed && param != paramsEnd; param = param->next())
3208+
shadowed = param->str() == nameToken->str();
3209+
if (!shadowed) {
3210+
tok1 = paramsEnd;
3211+
continue;
3212+
}
32063213
Token *declEndToken = TemplateSimplifier::findTemplateDeclarationEnd(tok1);
32073214
if (declEndToken)
32083215
tok1 = declEndToken;

‎test/testsimplifyusing.cpp‎

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ class TestSimplifyUsing : public TestFixture {
7979
TEST_CASE(simplifyUsing39);
8080
TEST_CASE(simplifyUsing40);
8181
TEST_CASE(simplifyUsing41);
82+
TEST_CASE(simplifyUsing42);
8283

8384
TEST_CASE(simplifyUsing8970);
8485
TEST_CASE(simplifyUsing8971);
@@ -956,6 +957,40 @@ class TestSimplifyUsing : public TestFixture {
956957
ASSERT_EQUALS(expected, tok(code));
957958
}
958959

960+
void simplifyUsing42() {
961+
{
962+
const char code[] = "using A = bool;\n"
963+
"template<typename T> A func() {}\n";
964+
const char expected[] = "template < typename T > bool func ( ) { }";
965+
ASSERT_EQUALS(expected, tok(code));
966+
}
967+
{
968+
const char code[] = "using A = bool;\n"
969+
"template<typename A> A func() {}\n";
970+
const char expected[] = "template < typename A > A func ( ) { }";
971+
ASSERT_EQUALS(expected, tok(code));
972+
}
973+
{
974+
const char code[] = "using A = bool;\n"
975+
"template<typename T> class C { A x; }\n";
976+
const char expected[] = "template < typename T > class C { bool x ; }";
977+
ASSERT_EQUALS(expected, tok(code));
978+
}
979+
{
980+
const char code[] = "using A = bool;\n"
981+
"template<typename A> class C { A x; }\n";
982+
const char expected[] = "template < typename A > class C { A x ; }";
983+
ASSERT_EQUALS(expected, tok(code));
984+
}
985+
{
986+
const char code[] = "using A = bool;\n"
987+
"template<typename T> class C { using A = T; A x; }\n"
988+
"C<int> c;\n";
989+
const char expected[] = "class C<int> ; C<int> c ; class C<int> { int x ; }";
990+
ASSERT_EQUALS(expected, tok(code));
991+
}
992+
}
993+
959994
void simplifyUsing8970() {
960995
const char code[] = "using V = std::vector<int>;\n"
961996
"struct A {\n"

0 commit comments

Comments
 (0)