[clang] Fix the double space and double attribute printing of the final keyword. (PR #88600)
Kim Gräsman via cfe-commits
cfe-commits at lists.llvm.org
Sat Apr 13 07:02:50 PDT 2024
kimgr wrote:
Thank you.
I believe this should cover both cases, added some attempt at rationale in comments:
```diff
diff --git a/clang/unittests/AST/DeclPrinterTest.cpp b/clang/unittests/AST/DeclPrinterTest.cpp
index f2b027a25621..8691a6c38f16 100644
--- a/clang/unittests/AST/DeclPrinterTest.cpp
+++ b/clang/unittests/AST/DeclPrinterTest.cpp
@@ -86,16 +86,13 @@ PrintedDeclCXX98Matches(StringRef Code, const DeclarationMatcher &NodeMatch,
ExpectedPrinted, "input.cc");
}
-::testing::AssertionResult PrintedDeclCXX11Matches(
- StringRef Code,
- const DeclarationMatcher &NodeMatch,
- StringRef ExpectedPrinted) {
+::testing::AssertionResult
+PrintedDeclCXX11Matches(StringRef Code, const DeclarationMatcher &NodeMatch,
+ StringRef ExpectedPrinted,
+ PrintingPolicyAdjuster PolicyModifier = nullptr) {
std::vector<std::string> Args(1, "-std=c++11");
- return PrintedDeclMatches(Code,
- Args,
- NodeMatch,
- ExpectedPrinted,
- "input.cc");
+ return PrintedDeclMatches(Code, Args, NodeMatch, ExpectedPrinted, "input.cc",
+ PolicyModifier);
}
::testing::AssertionResult PrintedDeclCXX11nonMSCMatches(
@@ -1556,3 +1553,25 @@ TEST(DeclPrinter, VarDeclWithInitializer) {
PrintedDeclCXX17Matches("void foo() {int arr[42]; for(int a : arr);}",
namedDecl(hasName("a")).bind("id"), "int a"));
}
+
+TEST(DeclPrinter, TestTemplateFinal) {
+ // By default we should print 'final' keyword whether class is implicitly or
+ // explicitly marked final.
+ ASSERT_TRUE(PrintedDeclCXX11Matches(
+ "template<typename T>\n"
+ "class FinalTemplate final {};",
+ classTemplateDecl(hasName("FinalTemplate")).bind("id"),
+ "template <typename T> class FinalTemplate final {}"));
+}
+
+TEST(DeclPrinter, TestTemplateFinalWithPolishForDecl) {
+ // clangd relies on the 'final' keyword being printed when
+ // PolishForDeclaration is enabled, so make sure it is even if implicit attrs
+ // are disabled.
+ ASSERT_TRUE(PrintedDeclCXX11Matches(
+ "template<typename T>\n"
+ "class FinalTemplate final {};",
+ classTemplateDecl(hasName("FinalTemplate")).bind("id"),
+ "template <typename T> class FinalTemplate final {}",
+ [](PrintingPolicy &Policy) { Policy.PolishForDeclaration = true; }));
+}
```
https://github.com/llvm/llvm-project/pull/88600
More information about the cfe-commits
mailing list