[llvm-branch-commits] [clang-doc] Use LangOpts when printing types (PR #120308)
via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Tue Dec 17 13:58:58 PST 2024
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-clang-tools-extra
Author: Paul Kirth (ilovepi)
<details>
<summary>Changes</summary>
The implementation in the clang-doc serializer failed to take in the
LangOpts from the declaration. Asa result, we'd do things like print
`_Bool` instead of `bool`, even in C++ code.
Fixes #<!-- -->62970
---
Full diff: https://github.com/llvm/llvm-project/pull/120308.diff
4 Files Affected:
- (modified) clang-tools-extra/clang-doc/Serialize.cpp (+13-8)
- (modified) clang-tools-extra/test/clang-doc/basic.cpp (+3-3)
- (modified) clang-tools-extra/test/clang-doc/templates.cpp (+6-6)
- (modified) clang-tools-extra/unittests/clang-doc/SerializeTest.cpp (+4-2)
``````````diff
diff --git a/clang-tools-extra/clang-doc/Serialize.cpp b/clang-tools-extra/clang-doc/Serialize.cpp
index b9db78cf7d688f..ddac5399b966d4 100644
--- a/clang-tools-extra/clang-doc/Serialize.cpp
+++ b/clang-tools-extra/clang-doc/Serialize.cpp
@@ -236,10 +236,10 @@ static RecordDecl *getRecordDeclForType(const QualType &T) {
return nullptr;
}
-TypeInfo getTypeInfoForType(const QualType &T) {
+TypeInfo getTypeInfoForType(const QualType &T, const PrintingPolicy& Policy) {
const TagDecl *TD = getTagDeclForType(T);
if (!TD)
- return TypeInfo(Reference(SymbolID(), T.getAsString()));
+ return TypeInfo(Reference(SymbolID(), T.getAsString(Policy)));
InfoType IT;
if (dyn_cast<EnumDecl>(TD)) {
@@ -250,7 +250,7 @@ TypeInfo getTypeInfoForType(const QualType &T) {
IT = InfoType::IT_default;
}
return TypeInfo(Reference(getUSRForDecl(TD), TD->getNameAsString(), IT,
- T.getAsString(), getInfoRelativePath(TD)));
+ T.getAsString(Policy), getInfoRelativePath(TD)));
}
static bool isPublic(const clang::AccessSpecifier AS,
@@ -379,10 +379,11 @@ static void parseFields(RecordInfo &I, const RecordDecl *D, bool PublicOnly,
if (!shouldSerializeInfo(PublicOnly, /*IsInAnonymousNamespace=*/false, F))
continue;
+ auto &LO = F->getLangOpts();
// Use getAccessUnsafe so that we just get the default AS_none if it's not
// valid, as opposed to an assert.
MemberTypeInfo &NewMember = I.Members.emplace_back(
- getTypeInfoForType(F->getTypeSourceInfo()->getType()),
+ getTypeInfoForType(F->getTypeSourceInfo()->getType(), LO),
F->getNameAsString(),
getFinalAccessSpecifier(Access, F->getAccessUnsafe()));
populateMemberTypeInfo(NewMember, F);
@@ -412,9 +413,10 @@ static void parseEnumerators(EnumInfo &I, const EnumDecl *D) {
}
static void parseParameters(FunctionInfo &I, const FunctionDecl *D) {
+ auto &LO = D->getLangOpts();
for (const ParmVarDecl *P : D->parameters()) {
FieldTypeInfo &FieldInfo = I.Params.emplace_back(
- getTypeInfoForType(P->getOriginalType()), P->getNameAsString());
+ getTypeInfoForType(P->getOriginalType(), LO), P->getNameAsString());
FieldInfo.DefaultValue = getSourceCode(D, P->getDefaultArgRange());
}
}
@@ -541,7 +543,8 @@ static void populateFunctionInfo(FunctionInfo &I, const FunctionDecl *D,
bool &IsInAnonymousNamespace) {
populateSymbolInfo(I, D, FC, LineNumber, Filename, IsFileInRootDir,
IsInAnonymousNamespace);
- I.ReturnType = getTypeInfoForType(D->getReturnType());
+ auto &LO = D->getLangOpts();
+ I.ReturnType = getTypeInfoForType(D->getReturnType(), LO);
parseParameters(I, D);
PopulateTemplateParameters(I.Template, D);
@@ -783,7 +786,8 @@ emitInfo(const TypedefDecl *D, const FullComment *FC, int LineNumber,
return {};
Info.DefLoc.emplace(LineNumber, File, IsFileInRootDir);
- Info.Underlying = getTypeInfoForType(D->getUnderlyingType());
+ auto &LO = D->getLangOpts();
+ Info.Underlying = getTypeInfoForType(D->getUnderlyingType(), LO);
if (Info.Underlying.Type.Name.empty()) {
// Typedef for an unnamed type. This is like "typedef struct { } Foo;"
// The record serializer explicitly checks for this syntax and constructs
@@ -809,7 +813,8 @@ emitInfo(const TypeAliasDecl *D, const FullComment *FC, int LineNumber,
return {};
Info.DefLoc.emplace(LineNumber, File, IsFileInRootDir);
- Info.Underlying = getTypeInfoForType(D->getUnderlyingType());
+ auto &LO = D->getLangOpts();
+ Info.Underlying = getTypeInfoForType(D->getUnderlyingType(), LO);
Info.IsUsing = true;
// Info is wrapped in its parent scope so is returned in the second position.
diff --git a/clang-tools-extra/test/clang-doc/basic.cpp b/clang-tools-extra/test/clang-doc/basic.cpp
index 318a271a9af04e..539ce8190ebbed 100644
--- a/clang-tools-extra/test/clang-doc/basic.cpp
+++ b/clang-tools-extra/test/clang-doc/basic.cpp
@@ -23,11 +23,11 @@ extern bool b();
// YAML-NEXT: Filename: '{{.*}}'
// YAML-NEXT: ReturnType:
// YAML-NEXT: Type:
-// YAML-NEXT: Name: '_Bool'
-// YAML-NEXT: QualName: '_Bool'
+// YAML-NEXT: Name: 'bool'
+// YAML-NEXT: QualName: 'bool'
// MD: ### b
-// MD: *_Bool b()*
+// MD: *bool b()*
char c();
diff --git a/clang-tools-extra/test/clang-doc/templates.cpp b/clang-tools-extra/test/clang-doc/templates.cpp
index 5229063f7ee236..cab5426b7cefc1 100644
--- a/clang-tools-extra/test/clang-doc/templates.cpp
+++ b/clang-tools-extra/test/clang-doc/templates.cpp
@@ -80,8 +80,8 @@ void function<bool, 0>(bool x) {}
// YAML-NEXT: Filename: '{{.*}}'
// YAML-NEXT: Params:
// YAML-NEXT: - Type:
-// YAML-NEXT: Name: '_Bool'
-// YAML-NEXT: QualName: '_Bool'
+// YAML-NEXT: Name: 'bool'
+// YAML-NEXT: QualName: 'bool'
// YAML-NEXT: Name: 'x'
// YAML-NEXT: ReturnType:
// YAML-NEXT: Type:
@@ -95,7 +95,7 @@ void function<bool, 0>(bool x) {}
// YAML-NEXT: - Contents: '0'
// MD: ### function
-// MD: *void function(_Bool x)*
+// MD: *void function(bool x)*
// MD: *Defined at {{.*}}templates.cpp#[[# @LINE - 26]]*
/// A Tuple type
@@ -136,7 +136,7 @@ tuple<int,int,bool> func_with_tuple_param(tuple<int,int,bool> t){ return t;}
// YAML-NEXT: - Type:
// YAML-NEXT: Type: Record
// YAML-NEXT: Name: 'tuple'
-// YAML-NEXT: QualName: 'tuple<int, int, _Bool>'
+// YAML-NEXT: QualName: 'tuple<int, int, bool>'
// YAML-NEXT: USR: '{{([0-9A-F]{40})}}'
// YAML-NEXT: Path: 'GlobalNamespace'
// YAML-NEXT: Name: 't'
@@ -144,13 +144,13 @@ tuple<int,int,bool> func_with_tuple_param(tuple<int,int,bool> t){ return t;}
// YAML-NEXT: Type:
// YAML-NEXT: Type: Record
// YAML-NEXT: Name: 'tuple'
-// YAML-NEXT: QualName: 'tuple<int, int, _Bool>'
+// YAML-NEXT: QualName: 'tuple<int, int, bool>'
// YAML-NEXT: USR: '{{([0-9A-F]{40})}}'
// YAML-NEXT: Path: 'GlobalNamespace'
// YAML-NEXT: ...
// MD: ### func_with_tuple_param
-// MD: *tuple<int, int, _Bool> func_with_tuple_param(tuple<int, int, _Bool> t)*
+// MD: *tuple<int, int, bool> func_with_tuple_param(tuple<int, int, bool> t)*
// MD: *Defined at {{.*}}templates.cpp#[[# @LINE - 44]]*
// MD: A function with a tuple parameter
// MD: **t** The input to func_with_tuple_param
diff --git a/clang-tools-extra/unittests/clang-doc/SerializeTest.cpp b/clang-tools-extra/unittests/clang-doc/SerializeTest.cpp
index 5df42b9f5bca0b..e6168418b58fa2 100644
--- a/clang-tools-extra/unittests/clang-doc/SerializeTest.cpp
+++ b/clang-tools-extra/unittests/clang-doc/SerializeTest.cpp
@@ -631,8 +631,8 @@ TEST(SerializeTests, emitTypedefs) {
TEST(SerializeTests, emitFunctionTemplate) {
EmittedInfoList Infos;
// A template and a specialization.
- ExtractInfosFromCode("template<typename T = int> void GetFoo(T);\n"
- "template<> void GetFoo<bool>(bool);",
+ ExtractInfosFromCode("template<typename T = int> bool GetFoo(T);\n"
+ "template<> bool GetFoo<bool>(bool);",
2,
/*Public=*/false, Infos);
@@ -666,6 +666,8 @@ TEST(SerializeTests, emitFunctionTemplate) {
ASSERT_EQ(1u, Func2.Template->Specialization->Params.size());
EXPECT_EQ("bool", Func2.Template->Specialization->Params[0].Contents);
EXPECT_EQ(Func1.USR, Func2.Template->Specialization->SpecializationOf);
+
+ EXPECT_EQ("bool", Func2.ReturnType.Type.Name);
}
TEST(SerializeTests, emitClassTemplate) {
``````````
</details>
https://github.com/llvm/llvm-project/pull/120308
More information about the llvm-branch-commits
mailing list