summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormydeveloperday <mydeveloperday@gmail.com>2021-12-14 14:45:26 +0000
committermydeveloperday <mydeveloperday@gmail.com>2021-12-14 14:53:04 +0000
commit6482383e50a4f02e337e7ce61a471e6295f008e4 (patch)
treec2890f1e9c5bed08fc24e6c1b3401cf635683976
parentddfac0759c3c21652672502646e5315554fa18eb (diff)
downloadllvm-6482383e50a4f02e337e7ce61a471e6295f008e4.tar.gz
[clang-format] FixNamespaceComments does not understand namespace aliases
https://github.com/llvm/llvm-project/issues/35876 Ensure a namespace alias doesn't get incorrectly identifier as a namespace Reviewed By: HazardyKnusperkeks, curdeius, owenpan Differential Revision: https://reviews.llvm.org/D115647 Fixes: #35876
-rw-r--r--clang/lib/Format/NamespaceEndCommentsFixer.cpp6
-rw-r--r--clang/unittests/Format/NamespaceEndCommentsFixerTest.cpp76
2 files changed, 81 insertions, 1 deletions
diff --git a/clang/lib/Format/NamespaceEndCommentsFixer.cpp b/clang/lib/Format/NamespaceEndCommentsFixer.cpp
index def551f863cd..38ab5b9df76d 100644
--- a/clang/lib/Format/NamespaceEndCommentsFixer.cpp
+++ b/clang/lib/Format/NamespaceEndCommentsFixer.cpp
@@ -180,9 +180,13 @@ getNamespaceToken(const AnnotatedLine *Line,
if (NamespaceTok->is(tok::l_brace)) {
// "namespace" keyword can be on the line preceding '{', e.g. in styles
// where BraceWrapping.AfterNamespace is true.
- if (StartLineIndex > 0)
+ if (StartLineIndex > 0) {
NamespaceTok = AnnotatedLines[StartLineIndex - 1]->First;
+ if (AnnotatedLines[StartLineIndex - 1]->endsWith(tok::semi))
+ return nullptr;
+ }
}
+
return NamespaceTok->getNamespaceToken();
}
diff --git a/clang/unittests/Format/NamespaceEndCommentsFixerTest.cpp b/clang/unittests/Format/NamespaceEndCommentsFixerTest.cpp
index 9b0301930d21..3afe35e7ea34 100644
--- a/clang/unittests/Format/NamespaceEndCommentsFixerTest.cpp
+++ b/clang/unittests/Format/NamespaceEndCommentsFixerTest.cpp
@@ -1185,6 +1185,82 @@ TEST_F(ShortNamespaceLinesTest, MultipleUnwrappedLine) {
"}\n",
Style));
}
+
+TEST_F(ShortNamespaceLinesTest, NamespaceAlias) {
+ auto Style = getLLVMStyle();
+
+ EXPECT_EQ("namespace n = nn;\n"
+ "{\n"
+ " int i;\n"
+ " int j;\n"
+ "}\n",
+ fixNamespaceEndComments("namespace n = nn;\n"
+ "{\n"
+ " int i;\n"
+ " int j;\n"
+ "}\n",
+ Style));
+
+ EXPECT_EQ("namespace n = nn; // comment\n"
+ "{\n"
+ " int i;\n"
+ " int j;\n"
+ "}\n",
+ fixNamespaceEndComments("namespace n = nn; // comment\n"
+ "{\n"
+ " int i;\n"
+ " int j;\n"
+ "}\n",
+ Style));
+
+ EXPECT_EQ("namespace n = nn; /* comment */\n"
+ "{\n"
+ " int i;\n"
+ " int j;\n"
+ "}\n",
+ fixNamespaceEndComments("namespace n = nn; /* comment */\n"
+ "{\n"
+ " int i;\n"
+ " int j;\n"
+ "}\n",
+ Style));
+
+ EXPECT_EQ(
+ "namespace n = nn; /* comment */ /* comment2 */\n"
+ "{\n"
+ " int i;\n"
+ " int j;\n"
+ "}\n",
+ fixNamespaceEndComments("namespace n = nn; /* comment */ /* comment2 */\n"
+ "{\n"
+ " int i;\n"
+ " int j;\n"
+ "}\n",
+ Style));
+
+ EXPECT_EQ("namespace n = nn; {\n"
+ " int i;\n"
+ " int j;\n"
+ "}\n",
+ fixNamespaceEndComments("namespace n = nn; {\n"
+ " int i;\n"
+ " int j;\n"
+ "}\n",
+ Style));
+ EXPECT_EQ("int foo;\n"
+ "namespace n\n"
+ "{\n"
+ " int i;\n"
+ " int j;\n"
+ "}// namespace n\n",
+ fixNamespaceEndComments("int foo;\n"
+ "namespace n\n"
+ "{\n"
+ " int i;\n"
+ " int j;\n"
+ "}\n",
+ Style));
+}
} // end namespace
} // end namespace format
} // end namespace clang