[Tooling] Handle AttributedType in getFullyQualifiedType (#134228)
Before this change the code used to add extra qualifiers, e.g. `std::unique_ptr<int> _Nonnull` became `::std::std::unique_ptr<int> _Nonnull` when adding a global namespace qualifier was requested.
This commit is contained in:
@@ -10,6 +10,7 @@
|
||||
#include "clang/AST/DeclTemplate.h"
|
||||
#include "clang/AST/DeclarationName.h"
|
||||
#include "clang/AST/Mangle.h"
|
||||
#include "clang/AST/Type.h"
|
||||
|
||||
namespace clang {
|
||||
|
||||
@@ -416,6 +417,18 @@ QualType getFullyQualifiedType(QualType QT, const ASTContext &Ctx,
|
||||
return QT;
|
||||
}
|
||||
|
||||
// Handle types with attributes such as `unique_ptr<int> _Nonnull`.
|
||||
if (auto *AT = dyn_cast<AttributedType>(QT.getTypePtr())) {
|
||||
QualType NewModified =
|
||||
getFullyQualifiedType(AT->getModifiedType(), Ctx, WithGlobalNsPrefix);
|
||||
QualType NewEquivalent =
|
||||
getFullyQualifiedType(AT->getEquivalentType(), Ctx, WithGlobalNsPrefix);
|
||||
Qualifiers Qualifiers = QT.getLocalQualifiers();
|
||||
return Ctx.getQualifiedType(
|
||||
Ctx.getAttributedType(AT->getAttrKind(), NewModified, NewEquivalent),
|
||||
Qualifiers);
|
||||
}
|
||||
|
||||
// Remove the part of the type related to the type being a template
|
||||
// parameter (we won't report it as part of the 'type name' and it
|
||||
// is actually make the code below to be more complex (to handle
|
||||
|
||||
@@ -297,4 +297,31 @@ TEST(QualTypeNameTest, ConstUsing) {
|
||||
using ::A::S;
|
||||
void foo(const S& param1, const S param2);)");
|
||||
}
|
||||
|
||||
TEST(QualTypeNameTest, NullableAttributesWithGlobalNs) {
|
||||
TypeNameVisitor Visitor;
|
||||
Visitor.WithGlobalNsPrefix = true;
|
||||
Visitor.ExpectedQualTypeNames["param1"] = "::std::unique_ptr<int> _Nullable";
|
||||
Visitor.ExpectedQualTypeNames["param2"] = "::std::unique_ptr<int> _Nonnull";
|
||||
Visitor.ExpectedQualTypeNames["param3"] =
|
||||
"::std::unique_ptr< ::std::unique_ptr<int> _Nullable> _Nonnull";
|
||||
Visitor.ExpectedQualTypeNames["param4"] =
|
||||
"::std::unique_ptr<int> _Nullable const *";
|
||||
Visitor.ExpectedQualTypeNames["param5"] =
|
||||
"::std::unique_ptr<int> _Nullable const *";
|
||||
Visitor.ExpectedQualTypeNames["param6"] =
|
||||
"::std::unique_ptr<int> _Nullable const *";
|
||||
Visitor.runOver(R"(namespace std {
|
||||
template<class T> class unique_ptr {};
|
||||
}
|
||||
void foo(
|
||||
std::unique_ptr<int> _Nullable param1,
|
||||
_Nonnull std::unique_ptr<int> param2,
|
||||
std::unique_ptr<std::unique_ptr<int> _Nullable> _Nonnull param3,
|
||||
const std::unique_ptr<int> _Nullable *param4,
|
||||
_Nullable std::unique_ptr<int> const *param5,
|
||||
std::unique_ptr<int> _Nullable const *param6
|
||||
);
|
||||
)");
|
||||
}
|
||||
} // end anonymous namespace
|
||||
|
||||
Reference in New Issue
Block a user