[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 12:19:20 PDT 2011


I tweaked this for ARC in r138261.

On Aug 22, 2011, at 11:15 AM, Ted Kremenek wrote:

> 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
> 
> _______________________________________________
> 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