[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