Skip to content

Commit 0c0aea0

Browse files
author
Eric Liu
committed
[change-namespace] fix a case references to templated using alias are qualified types.
llvm-svn: 289816
1 parent 2606c48 commit 0c0aea0

File tree

2 files changed

+18
-4
lines changed

2 files changed

+18
-4
lines changed

clang-tools-extra/change-namespace/ChangeNamespace.cpp

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -457,16 +457,18 @@ void ChangeNamespaceTool::run(
457457
// This avoids fixing types with record types as qualifier, which is not
458458
// filtered by matchers in some cases, e.g. the type is templated. We should
459459
// handle the record type qualifier instead.
460-
if (TLoc->getTypeLocClass() == TypeLoc::Elaborated) {
460+
TypeLoc Loc = *TLoc;
461+
while (Loc.getTypeLocClass() == TypeLoc::Qualified)
462+
Loc = Loc.getNextTypeLoc();
463+
if (Loc.getTypeLocClass() == TypeLoc::Elaborated) {
461464
NestedNameSpecifierLoc NestedNameSpecifier =
462-
TLoc->castAs<ElaboratedTypeLoc>().getQualifierLoc();
465+
Loc.castAs<ElaboratedTypeLoc>().getQualifierLoc();
463466
const Type *SpecifierType =
464467
NestedNameSpecifier.getNestedNameSpecifier()->getAsType();
465468
if (SpecifierType && SpecifierType->isRecordType())
466469
return;
467470
}
468-
fixTypeLoc(Result, startLocationForType(*TLoc), endLocationForType(*TLoc),
469-
*TLoc);
471+
fixTypeLoc(Result, startLocationForType(Loc), endLocationForType(Loc), Loc);
470472
} else if (const auto *VarRef =
471473
Result.Nodes.getNodeAs<DeclRefExpr>("var_ref")) {
472474
const auto *Var = Result.Nodes.getNodeAs<VarDecl>("var_decl");

clang-tools-extra/unittests/change-namespace/ChangeNamespaceTests.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1365,13 +1365,19 @@ TEST_F(ChangeNamespaceTest, TemplateUsingAliasInBaseClass) {
13651365
"public:\n"
13661366
" template<typename P>\n"
13671367
" using GG = some_ns::G<int, P>;\n"
1368+
"\n"
1369+
" struct Nested {};\n"
13681370
"};\n"
13691371
"class Derived : public Base {};\n"
13701372
"} // namespace na\n"
13711373
"namespace na {\n"
13721374
"namespace nb {\n"
13731375
"void f() {\n"
13741376
" Derived::GG<float> g;\n"
1377+
" const Derived::GG<int> gg;\n"
1378+
" const Derived::GG<int>* gg_ptr;\n"
1379+
" struct Derived::Nested nested;\n"
1380+
" const struct Derived::Nested *nested_ptr;\n"
13751381
"}\n"
13761382
"} // namespace nb\n"
13771383
"} // namespace na\n";
@@ -1384,6 +1390,8 @@ TEST_F(ChangeNamespaceTest, TemplateUsingAliasInBaseClass) {
13841390
"public:\n"
13851391
" template<typename P>\n"
13861392
" using GG = some_ns::G<int, P>;\n"
1393+
"\n"
1394+
" struct Nested {};\n"
13871395
"};\n"
13881396
"class Derived : public Base {};\n"
13891397
"} // namespace na\n"
@@ -1392,6 +1400,10 @@ TEST_F(ChangeNamespaceTest, TemplateUsingAliasInBaseClass) {
13921400
"namespace nc {\n"
13931401
"void f() {\n"
13941402
" Derived::GG<float> g;\n"
1403+
" const Derived::GG<int> gg;\n"
1404+
" const Derived::GG<int>* gg_ptr;\n"
1405+
" struct Derived::Nested nested;\n"
1406+
" const struct Derived::Nested *nested_ptr;\n"
13951407
"}\n"
13961408
"} // namespace nc\n\n"
13971409
"} // namespace nb\n"

0 commit comments

Comments
 (0)