[cfe-commits] r138240 - in /cfe/trunk: include/clang/Basic/DiagnosticGroups.td include/clang/Basic/DiagnosticSemaKinds.td include/clang/Sema/Sema.h lib/Sema/Sema.cpp lib/Sema/SemaDecl.cpp lib/Sema/SemaDeclObjC.cpp lib/Sema/SemaExprObjC.cpp test/SemaObjC/warn-missing-super.m
Ted Kremenek
kremenek at apple.com
Mon Aug 22 11:15:31 PDT 2011
Hi Nico,
Thanks for doing this. One thing I should add is this should not fire when building under ARC, as explicitly calling -dealloc is illegal. Under -arc, [super dealloc] is essentially handled automatically by the compiler.
On Aug 22, 2011, at 10:25 AM, Nico Weber wrote:
> Author: nico
> Date: Mon Aug 22 12:25:57 2011
> New Revision: 138240
>
> URL: http://llvm.org/viewvc/llvm-project?rev=138240&view=rev
> Log:
> Warn on missing [super dealloc] calls.
>
> This matches gcc's logic. Half of PR10661.
>
>
> Added:
> cfe/trunk/test/SemaObjC/warn-missing-super.m
> Modified:
> cfe/trunk/include/clang/Basic/DiagnosticGroups.td
> cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
> cfe/trunk/include/clang/Sema/Sema.h
> cfe/trunk/lib/Sema/Sema.cpp
> cfe/trunk/lib/Sema/SemaDecl.cpp
> cfe/trunk/lib/Sema/SemaDeclObjC.cpp
> cfe/trunk/lib/Sema/SemaExprObjC.cpp
>
> Modified: cfe/trunk/include/clang/Basic/DiagnosticGroups.td
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticGroups.td?rev=138240&r1=138239&r2=138240&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Basic/DiagnosticGroups.td (original)
> +++ cfe/trunk/include/clang/Basic/DiagnosticGroups.td Mon Aug 22 12:25:57 2011
> @@ -96,6 +96,7 @@
> def : DiagGroup<"overflow">;
> def OverlengthStrings : DiagGroup<"overlength-strings">;
> def OverloadedVirtual : DiagGroup<"overloaded-virtual">;
> +def ObjCMissingSuperCalls : DiagGroup<"objc-missing-super-calls">;
> def Packed : DiagGroup<"packed">;
> def Padded : DiagGroup<"padded">;
> def PointerArith : DiagGroup<"pointer-arith">;
> @@ -273,6 +274,7 @@
> UnknownPragmas,
> Unused,
> VolatileRegisterVar,
> + ObjCMissingSuperCalls,
> OverloadedVirtual
> ]>;
>
>
> Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td?rev=138240&r1=138239&r2=138240&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original)
> +++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Mon Aug 22 12:25:57 2011
> @@ -570,6 +570,9 @@
> def warn_objc_property_attr_mutually_exclusive : Warning<
> "property attributes '%0' and '%1' are mutually exclusive">,
> InGroup<ReadOnlySetterAttrs>, DefaultIgnore;
> +def warn_objc_missing_super_dealloc : Warning<
> + "method possibly missing a [super dealloc] call">,
> + InGroup<ObjCMissingSuperCalls>;
> def warn_undeclared_selector : Warning<
> "undeclared selector %0">, InGroup<UndeclaredSelector>, DefaultIgnore;
> def warn_implicit_atomic_property : Warning<
>
> Modified: cfe/trunk/include/clang/Sema/Sema.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Sema/Sema.h?rev=138240&r1=138239&r2=138240&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Sema/Sema.h (original)
> +++ cfe/trunk/include/clang/Sema/Sema.h Mon Aug 22 12:25:57 2011
> @@ -489,6 +489,11 @@
> /// have been declared.
> bool GlobalNewDeleteDeclared;
>
> +
> + /// A flag that is set when parsing a -dealloc method and no [super dealloc]
> + /// call was found yet.
> + bool ObjCShouldCallSuperDealloc;
> +
> /// \brief The set of declarations that have been referenced within
> /// a potentially evaluated expression.
> typedef SmallVector<std::pair<SourceLocation, Decl *>, 10>
>
> Modified: cfe/trunk/lib/Sema/Sema.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/Sema.cpp?rev=138240&r1=138239&r2=138240&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Sema/Sema.cpp (original)
> +++ cfe/trunk/lib/Sema/Sema.cpp Mon Aug 22 12:25:57 2011
> @@ -84,6 +84,7 @@
> ExprNeedsCleanups(0), LateTemplateParser(0), OpaqueParser(0),
> IdResolver(pp.getLangOptions()), CXXTypeInfoDecl(0), MSVCGuidDecl(0),
> GlobalNewDeleteDeclared(false),
> + ObjCShouldCallSuperDealloc(false),
> CompleteTranslationUnit(CompleteTranslationUnit),
> NumSFINAEErrors(0), SuppressAccessChecking(false),
> AccessCheckingSFINAE(false), InNonInstantiationSFINAEContext(false),
>
> Modified: cfe/trunk/lib/Sema/SemaDecl.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDecl.cpp?rev=138240&r1=138239&r2=138240&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaDecl.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaDecl.cpp Mon Aug 22 12:25:57 2011
> @@ -6690,10 +6690,17 @@
> DiagnoseSizeOfParametersAndReturnValue(MD->param_begin(), MD->param_end(),
> MD->getResultType(), MD);
> }
> + if (ObjCShouldCallSuperDealloc) {
> + Diag(MD->getLocEnd(), diag::warn_objc_missing_super_dealloc);
> + ObjCShouldCallSuperDealloc = false;
> + }
> } else {
> return 0;
> }
>
> + assert(!ObjCShouldCallSuperDealloc && "This should only be set for "
> + "ObjC methods, which should have been handled in the block above.");
> +
> // Verify and clean out per-function state.
> if (Body) {
> // C++ constructors that have function-try-blocks can't have return
>
> Modified: cfe/trunk/lib/Sema/SemaDeclObjC.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclObjC.cpp?rev=138240&r1=138239&r2=138240&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaDeclObjC.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaDeclObjC.cpp Mon Aug 22 12:25:57 2011
> @@ -278,14 +278,22 @@
> }
> }
>
> - // Warn on implementating deprecated methods under
> - // -Wdeprecated-implementations flag.
> - if (ObjCInterfaceDecl *IC = MDecl->getClassInterface())
> + // Warn on deprecated methods under -Wdeprecated-implementations,
> + // and prepare for warning on missing super calls.
> + if (ObjCInterfaceDecl *IC = MDecl->getClassInterface()) {
> if (ObjCMethodDecl *IMD =
> IC->lookupMethod(MDecl->getSelector(), MDecl->isInstanceMethod()))
> DiagnoseObjCImplementedDeprecations(*this,
> dyn_cast<NamedDecl>(IMD),
> MDecl->getLocation(), 0);
> +
> + // If this is "dealloc", set some bit here.
> + // Then in ActOnSuperMessage() (SemaExprObjC), set it back to false.
> + // Finally, in ActOnFinishFunctionBody() (SemaDecl), warn if flag is set.
> + // Only do this if the current class actually has a superclass.
> + if (IC->getSuperClass())
> + ObjCShouldCallSuperDealloc = MDecl->getMethodFamily() == OMF_dealloc;
> + }
> }
>
> Decl *Sema::
>
> Modified: cfe/trunk/lib/Sema/SemaExprObjC.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExprObjC.cpp?rev=138240&r1=138239&r2=138240&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaExprObjC.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaExprObjC.cpp Mon Aug 22 12:25:57 2011
> @@ -975,6 +975,9 @@
> // We are in a method whose class has a superclass, so 'super'
> // is acting as a keyword.
> if (Method->isInstanceMethod()) {
> + if (Sel.getMethodFamily() == OMF_dealloc)
> + ObjCShouldCallSuperDealloc = false;
> +
> // Since we are in an instance method, this is an instance
> // message to the superclass instance.
> QualType SuperTy = Context.getObjCInterfaceType(Super);
>
> Added: cfe/trunk/test/SemaObjC/warn-missing-super.m
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaObjC/warn-missing-super.m?rev=138240&view=auto
> ==============================================================================
> --- cfe/trunk/test/SemaObjC/warn-missing-super.m (added)
> +++ cfe/trunk/test/SemaObjC/warn-missing-super.m Mon Aug 22 12:25:57 2011
> @@ -0,0 +1,32 @@
> +// RUN: %clang_cc1 -fsyntax-only -verify %s
> +
> + at protocol NSCopying @end
> +
> + at interface NSObject <NSCopying>
> +- (void)dealloc;
> + at end
> +
> + at implementation NSObject
> +- (void)dealloc {
> + // Root class, shouldn't warn
> +}
> + at end
> +
> + at interface Subclass1 : NSObject
> +- (void)dealloc;
> + at end
> +
> + at implementation Subclass1
> +- (void)dealloc {
> +} // expected-warning{{method possibly missing a [super dealloc] call}}
> + at end
> +
> + at interface Subclass2 : NSObject
> +- (void)dealloc;
> + at end
> +
> + at implementation Subclass2
> +- (void)dealloc {
> + [super dealloc]; // Shouldn't warn
> +}
> + at end
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
More information about the cfe-commits
mailing list