[PATCH] D39913: [ObjC] warn about availability attributes missing from a method's declaration when they're specified for a method's definition
Aaron Ballman via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Sat Nov 25 06:48:51 PST 2017
aaron.ballman requested changes to this revision.
aaron.ballman added inline comments.
This revision now requires changes to proceed.
================
Comment at: include/clang/Basic/DiagnosticSemaKinds.td:2921
+def warn_availability_on_implementation_not_interface : Warning<
+ "method declaration is missing an availability attribute for "
+ "%0 that is specified in the definition">,
----------------
Please quote 'availability' in the diagnostic wording. Same for the note.
================
Comment at: include/clang/Basic/DiagnosticSemaKinds.td:2925
+def warn_deprecated_on_implementation_not_interface : Warning<
+ "method declaration is missing a deprecated attribute that is specified in "
+ "the definition">,
----------------
Please quote 'deprecated' in the diagnostic wording. Same for the note.
One concern I have about this diagnostic is that it suggests this will happen for *all* deprecated attributes when it does not.
================
Comment at: include/clang/Sema/Sema.h:2406-2407
+ /// This will warn on any missing clauses in the declaration.
+ void checkMissingAvailabilityClausesInDeclaration(NamedDecl *Original,
+ NamedDecl *Implementation);
+
----------------
These should be `const` pointers.
Does this *only* warn on missing clauses, or does it also warn on conflicting clauses as the first sentence suggests?
================
Comment at: lib/Sema/SemaDecl.cpp:3581-3582
+ if (Imp->getClassInterface() == DC ||
+ (isa<ObjCCategoryDecl>(DC) &&
+ cast<ObjCCategoryDecl>(DC)->IsClassExtension() &&
+ Imp->getClassInterface() ==
----------------
Please do not use `isa<>` followed by `cast<>` (same below). Rather than use this complex if statement, it might be better to split things out into local variables.
================
Comment at: lib/Sema/SemaDeclAttr.cpp:2286
+ llvm::SmallPtrSet<const IdentifierInfo *, 4> MissingPlatformAttributes;
+ for (auto *Def : Implementation->specific_attrs<AvailabilityAttr>()) {
+ bool MissingIntroduced = !Def->getIntroduced().empty();
----------------
`const auto *`
================
Comment at: lib/Sema/SemaDeclAttr.cpp:2291
+ bool MissingUnavailable = Def->getUnavailable();
+ for (auto *Decl : Original->specific_attrs<AvailabilityAttr>()) {
+ if (Def->getPlatform() != Decl->getPlatform())
----------------
`const auto *`
================
Comment at: lib/Sema/SemaDeclAttr.cpp:2295
+ MissingIntroduced =
+ MissingIntroduced ? Decl->getIntroduced().empty() : false;
+ MissingDeprecated =
----------------
ahatanak wrote:
> I feel like using "if" is easier to understand than a conditional operator, but it's up to you:
>
> ```
> if (MissingIntroduced)
> MissingIntroduced = Decl->getIntroduced().empty();
> ```
The pattern we usually see is: `MissingIntroduced = MissingIntroduced && Decl->getIntroduced().empty();`
Repository:
rL LLVM
https://reviews.llvm.org/D39913
More information about the cfe-commits
mailing list