diff options
author | Dmitri Gribenko <gribozavr@gmail.com> | 2012-09-22 21:47:50 +0000 |
---|---|---|
committer | Dmitri Gribenko <gribozavr@gmail.com> | 2012-09-22 21:47:50 +0000 |
commit | 0bd9838751384181ff387f2fb346896792b89617 (patch) | |
tree | 4cd487eea2b5f4211d1a9cbe6c7210e71c3ff182 /lib/AST/CommentSema.cpp | |
parent | 4bc38d69a2cf391555644900d78d074634973aa5 (diff) |
Comment sema: warn when comment has \deprecated but declaration does not have a
deprecation attribute ('deprecated', 'availability' or 'unavailable').
This warning is under a separate flag, -Wdocumentation-deprecated-sync, so it
can be turned off easily while leaving other -Wdocumentation warnings on.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@164467 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/AST/CommentSema.cpp')
-rw-r--r-- | lib/AST/CommentSema.cpp | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/lib/AST/CommentSema.cpp b/lib/AST/CommentSema.cpp index 6d84a2a4b9..4f9f1f241c 100644 --- a/lib/AST/CommentSema.cpp +++ b/lib/AST/CommentSema.cpp @@ -59,6 +59,7 @@ void Sema::actOnBlockCommandFinish(BlockCommandComment *Command, checkBlockCommandEmptyParagraph(Command); checkBlockCommandDuplicate(Command); checkReturnsCommand(Command); + checkDeprecatedCommand(Command); } ParamCommandComment *Sema::actOnParamCommandStart(SourceLocation LocBegin, @@ -500,6 +501,39 @@ void Sema::checkBlockCommandDuplicate(const BlockCommandComment *Command) { << CommandName; } +void Sema::checkDeprecatedCommand(const BlockCommandComment *Command) { + if (!Traits.getCommandInfo(Command->getCommandID())->IsDeprecatedCommand) + return; + + const Decl *D = ThisDeclInfo->ThisDecl; + if (!D) + return; + + if (D->hasAttr<DeprecatedAttr>() || + D->hasAttr<AvailabilityAttr>() || + D->hasAttr<UnavailableAttr>()) + return; + + Diag(Command->getLocation(), + diag::warn_doc_deprecated_not_sync) + << Command->getSourceRange(); + + // Try to emit a fixit with a deprecation attribute. + if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) { + // Don't emit a Fix-It for non-member function definitions. GCC does not + // accept attributes on them. + const DeclContext *Ctx = FD->getDeclContext(); + if ((!Ctx || !Ctx->isRecord()) && + FD->doesThisDeclarationHaveABody()) + return; + + Diag(FD->getLocEnd(), + diag::note_add_deprecation_attr) + << FixItHint::CreateInsertion(FD->getLocEnd().getLocWithOffset(1), + " __attribute__((deprecated))"); + } +} + void Sema::resolveParamCommandIndexes(const FullComment *FC) { if (!isFunctionDecl()) { // We already warned that \\param commands are not attached to a function |