Skip to content

Commit 3e278b3

Browse files
committed
[cling][AST] Preserve using aliases in GetFullTypeName
Teach getFullyQualifiedType() to rebuild UsingType nodes instead of desugaring them. This preserves the written alias while still fully qualifying the underlying type, similar the existing TypedefType handling.
1 parent 6b99253 commit 3e278b3

3 files changed

Lines changed: 17 additions & 9 deletions

File tree

interpreter/cling/lib/Utils/AST.cpp

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -558,13 +558,6 @@ namespace TypeName {
558558
Qualifiers PrefixQualifiers = QT.getLocalQualifiers();
559559
QT = QualType(QT.getTypePtr(), 0);
560560

561-
// We don't consider the alias introduced by `using a::X` as a new type.
562-
// The qualified name is still a::X.
563-
if (const auto *UT = QT->getAs<UsingType>()) {
564-
QT = Ctx.getQualifiedType(UT->desugar(), PrefixQualifiers);
565-
return getFullyQualifiedType(QT, Ctx, WithGlobalNsPrefix);
566-
}
567-
568561
// Create a nested name specifier if needed.
569562
NestedNameSpecifier Prefix = createNestedNameSpecifierForScopeOf(
570563
Ctx, QT.getTypePtr(), true /*FullyQualified*/, WithGlobalNsPrefix);
@@ -583,6 +576,10 @@ namespace TypeName {
583576
QT = Ctx.getTypedefType(
584577
TT->getKeyword(), Prefix, TT->getDecl(),
585578
getFullyQualifiedType(TT->desugar(), Ctx, WithGlobalNsPrefix));
579+
} else if (const auto* UT = dyn_cast<UsingType>(QT.getTypePtr())) {
580+
QT = Ctx.getUsingType(UT->getKeyword(), Prefix, UT->getDecl(),
581+
getFullyQualifiedType(UT->desugar(), Ctx,
582+
WithGlobalNsPrefix));
586583
} else {
587584
assert(!Prefix && "Unhandled type node");
588585
}
@@ -674,6 +671,11 @@ namespace utils {
674671
QT = Ctx.getTypedefType(TT->getKeyword(), prefix, TT->getDecl(),
675672
TypeName::getFullyQualifiedType(
676673
TT->desugar(), Ctx, WithGlobalNsPrefix));
674+
} else if (const auto* UT = dyn_cast<UsingType>(QT.getTypePtr())) {
675+
QT =
676+
Ctx.getUsingType(UT->getKeyword(), prefix, UT->getDecl(),
677+
getFullyQualifiedType(UT->desugar(), Ctx,
678+
WithGlobalNsPrefix));
677679
}
678680
return QT;
679681
}

roottest/root/meta/naming/execResolveTypedef.cxx

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,10 @@
1414

1515
namespace A1 { namespace B2 { namespace C3 { typedef int what; } } }
1616
namespace NS { typedef int IntNS_t; }
17-
namespace SG { typedef std::uint32_t sgkey_t; }
17+
namespace SG {
18+
typedef std::uint32_t sgkey_t;
19+
using sgkey2_t = std::uint32_t;
20+
} // namespace SG
1821
namespace RT {
1922
namespace EX {
2023
struct ClusterSize {
@@ -27,6 +30,7 @@ using ClusterSize_t = ClusterSize;
2730

2831
struct PackedParameters {
2932
SG::sgkey_t m_sgkey;
33+
SG::sgkey2_t m_sgkey2;
3034
};
3135

3236
class Object
@@ -226,6 +230,7 @@ int execResolveTypedef()
226230
testing("unsigned int", TClassEdit::ResolveTypedef("SG::sgkey_t"));
227231
testing("unsigned int", TClass::GetClass("PackedParameters")->GetDataMember("m_sgkey")->GetTrueTypeName());
228232
testing("SG::sgkey_t", TClass::GetClass("PackedParameters")->GetDataMember("m_sgkey")->GetFullTypeName());
233+
testing("SG::sgkey2_t", TClass::GetClass("PackedParameters")->GetDataMember("m_sgkey2")->GetFullTypeName());
229234
testing("RT::EX::ClusterSize", TClassEdit::ResolveTypedef("RT::EX::ClusterSize_t"));
230235
return 0;
231236
}

roottest/root/meta/naming/execResolveTypedef.ref

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,5 +86,6 @@ Test 83 The result is correct: ::int
8686
Test 84 The result is correct: unsigned int
8787
Test 85 The result is correct: unsigned int
8888
Test 86 The result is correct: SG::sgkey_t
89-
Test 87 The result is correct: RT::EX::ClusterSize
89+
Test 87 The result is correct: SG::sgkey2_t
90+
Test 88 The result is correct: RT::EX::ClusterSize
9091
(int) 0

0 commit comments

Comments
 (0)