]> granicus.if.org Git - clang/commitdiff
Add a warning about almost-Doxygen trailing comments: //< and /*< ... */
authorDmitri Gribenko <gribozavr@gmail.com>
Fri, 22 Jun 2012 16:02:55 +0000 (16:02 +0000)
committerDmitri Gribenko <gribozavr@gmail.com>
Fri, 22 Jun 2012 16:02:55 +0000 (16:02 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@159001 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Basic/DiagnosticGroups.td
include/clang/Basic/DiagnosticSemaKinds.td
lib/Sema/Sema.cpp
test/Analysis/retain-release.m
test/Sema/doxygen-comments.c [new file with mode: 0644]

index 978e951acf46988b92bf4a9fd74326030b66c1cf..0b46c8a8ba250d5551ee0540b603472dd8571665 100644 (file)
@@ -57,6 +57,7 @@ def DeprecatedImplementations :DiagGroup<"deprecated-implementations">;
 def : DiagGroup<"disabled-optimization">;
 def : DiagGroup<"discard-qual">;
 def : DiagGroup<"div-by-zero">;
+def Doxygen : DiagGroup<"doxygen">;
 def EmptyBody : DiagGroup<"empty-body">;
 def ExtraTokens : DiagGroup<"extra-tokens">;
 
index 43ef9aca5832162815e31285de9a84ac49446bf0..a8150b73b908dc8d8f27c3ea1cec0f2a2bbb51e8 100644 (file)
@@ -5665,5 +5665,10 @@ def err_module_private_definition : Error<
   "definition of %0 must be imported before it is required">;
 }
 
+let CategoryName = "Documentation Issue" in {
+def warn_not_a_doxygen_trailing_member_comment : Warning<
+  "not a Doxygen trailing comment">, InGroup<Doxygen>;
+} // end of documentation issue category
+
 } // end of sema component.
 
index 9e4b29197138a193a7a110f2f83a74825d79cb14..9d18a5c59638957d888181b4a33585f61fb6fafd 100644 (file)
@@ -1016,6 +1016,24 @@ LambdaScopeInfo *Sema::getCurLambda() {
 
 void Sema::ActOnComment(SourceRange Comment) {
   RawComment RC(SourceMgr, Comment);
+  if (RC.isAlmostTrailingComment()) {
+    SourceRange MagicMarkerRange(Comment.getBegin(),
+                                 Comment.getBegin().getLocWithOffset(3));
+    StringRef MagicMarkerText;
+    switch (RC.getKind()) {
+    case RawComment::CK_OrdinaryBCPL:
+      MagicMarkerText = "///<";
+      break;
+    case RawComment::CK_OrdinaryC:
+      MagicMarkerText = "/**<";
+      break;
+    default:
+      llvm_unreachable("if this is an almost Doxygen comment, "
+                       "it should be ordinary");
+    }
+    Diag(Comment.getBegin(), diag::warn_not_a_doxygen_trailing_member_comment) <<
+      FixItHint::CreateReplacement(MagicMarkerRange, MagicMarkerText);
+  }
   Context.addComment(RC);
 }
 
index cda60b1420966d7be70451c5727f3278960a484a..87e09e9a837d9526b2eb4ce50e167939b8c26733 100644 (file)
@@ -753,7 +753,7 @@ typedef CFTypeRef OtherRef;
 @end
 
 //===----------------------------------------------------------------------===//
-//<rdar://problem/6320065> false positive - init method returns an object
+// <rdar://problem/6320065> false positive - init method returns an object
 // owned by caller
 //===----------------------------------------------------------------------===//
 
diff --git a/test/Sema/doxygen-comments.c b/test/Sema/doxygen-comments.c
new file mode 100644 (file)
index 0000000..d2b0dae
--- /dev/null
@@ -0,0 +1,14 @@
+// RUN: %clang_cc1 -fsyntax-only -verify %s
+// RUN: %clang_cc1 -fsyntax-only -fdiagnostics-parseable-fixits %s 2>&1 | FileCheck %s
+// RUN: cp %s %t
+// RUN: %clang_cc1 -fsyntax-only -fixit %t
+// RUN: %clang_cc1 -fsyntax-only -Werror %t
+
+struct a {
+  int x; //< comment // expected-warning {{not a Doxygen trailing comment}}
+  int y; /*< comment */ // expected-warning {{not a Doxygen trailing comment}}
+};
+
+// CHECK: fix-it:"{{.*}}":{8:10-8:13}:"///<"
+// CHECK: fix-it:"{{.*}}":{9:10-9:13}:"/**<"
+