[cfe-commits] r160993 - in /cfe/trunk: include/clang/Basic/DiagnosticSemaKinds.td lib/Sema/SemaDeclObjC.cpp test/ARCMT/releases-driver.m test/ARCMT/releases-driver.m.result test/ARCMT/releases.m test/ARCMT/releases.m.result test/SemaObjC/dealloc.m

Fariborz Jahanian fjahanian at apple.com
Mon Jul 30 13:52:48 PDT 2012


Author: fjahanian
Date: Mon Jul 30 15:52:48 2012
New Revision: 160993

URL: http://llvm.org/viewvc/llvm-project?rev=160993&view=rev
Log:
objective-c arc: ARC IRGen correctly assumes result
type of generated call to super dealloc is 'void'
and asserts if user's dealloc is not of 'void type.
This rule must be enforced in clang front-end (with a 
fixit) if this is not the case, instead of asserting in CodeGen.
// rdar://11987838

Added:
    cfe/trunk/test/SemaObjC/dealloc.m
Modified:
    cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
    cfe/trunk/lib/Sema/SemaDeclObjC.cpp
    cfe/trunk/test/ARCMT/releases-driver.m
    cfe/trunk/test/ARCMT/releases-driver.m.result
    cfe/trunk/test/ARCMT/releases.m
    cfe/trunk/test/ARCMT/releases.m.result

Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td?rev=160993&r1=160992&r2=160993&view=diff
==============================================================================
--- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original)
+++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Mon Jul 30 15:52:48 2012
@@ -731,6 +731,9 @@
 def warn_objc_missing_super_dealloc : Warning<
   "method possibly missing a [super dealloc] call">,
   InGroup<ObjCMissingSuperCalls>;
+def error_dealloc_bad_result_type : Error<
+  "dealloc return type must be correctly specified as 'void' under ARC, "
+  "instead of %0">;
 def warn_objc_missing_super_finalize : Warning<
   "method possibly missing a [super finalize] call">,
   InGroup<ObjCMissingSuperCalls>;

Modified: cfe/trunk/lib/Sema/SemaDeclObjC.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclObjC.cpp?rev=160993&r1=160992&r2=160993&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaDeclObjC.cpp (original)
+++ cfe/trunk/lib/Sema/SemaDeclObjC.cpp Mon Jul 30 15:52:48 2012
@@ -197,7 +197,6 @@
   ObjCMethodFamily family = method->getMethodFamily();
   switch (family) {
   case OMF_None:
-  case OMF_dealloc:
   case OMF_finalize:
   case OMF_retain:
   case OMF_release:
@@ -207,6 +206,24 @@
   case OMF_performSelector:
     return false;
 
+  case OMF_dealloc:
+    if (!S.Context.hasSameType(method->getResultType(), S.Context.VoidTy)) {
+      SourceRange ResultTypeRange;
+      if (const TypeSourceInfo *ResultTypeInfo
+          = method->getResultTypeSourceInfo())
+        ResultTypeRange = ResultTypeInfo->getTypeLoc().getSourceRange();
+      if (ResultTypeRange.isInvalid())
+        S.Diag(method->getLocation(), diag::error_dealloc_bad_result_type) 
+          << method->getResultType() 
+          << FixItHint::CreateInsertion(method->getSelectorLoc(0), "(void)");
+      else
+        S.Diag(method->getLocation(), diag::error_dealloc_bad_result_type) 
+          << method->getResultType() 
+          << FixItHint::CreateReplacement(ResultTypeRange, "void");
+      return true;
+    }
+    return false;
+      
   case OMF_init:
     // If the method doesn't obey the init rules, don't bother annotating it.
     if (S.checkInitMethod(method, QualType()))

Modified: cfe/trunk/test/ARCMT/releases-driver.m
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/ARCMT/releases-driver.m?rev=160993&r1=160992&r2=160993&view=diff
==============================================================================
--- cfe/trunk/test/ARCMT/releases-driver.m (original)
+++ cfe/trunk/test/ARCMT/releases-driver.m Mon Jul 30 15:52:48 2012
@@ -53,9 +53,8 @@
 @end
 
 @implementation Baz
-- dealloc {
+- (void) dealloc {
   [_foo release];
-  return 0;
 }
 @end
 

Modified: cfe/trunk/test/ARCMT/releases-driver.m.result
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/ARCMT/releases-driver.m.result?rev=160993&r1=160992&r2=160993&view=diff
==============================================================================
--- cfe/trunk/test/ARCMT/releases-driver.m.result (original)
+++ cfe/trunk/test/ARCMT/releases-driver.m.result Mon Jul 30 15:52:48 2012
@@ -49,9 +49,6 @@
 @end
 
 @implementation Baz
-- dealloc {
-  return 0;
-}
 @end
 
 #define RELEASE_MACRO(x) [x release]

Modified: cfe/trunk/test/ARCMT/releases.m
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/ARCMT/releases.m?rev=160993&r1=160992&r2=160993&view=diff
==============================================================================
--- cfe/trunk/test/ARCMT/releases.m (original)
+++ cfe/trunk/test/ARCMT/releases.m Mon Jul 30 15:52:48 2012
@@ -58,9 +58,8 @@
 @end
 
 @implementation Baz
-- dealloc {
+- (void) dealloc {
   [_foo release];
-  return 0;
 }
 @end
 

Modified: cfe/trunk/test/ARCMT/releases.m.result
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/ARCMT/releases.m.result?rev=160993&r1=160992&r2=160993&view=diff
==============================================================================
--- cfe/trunk/test/ARCMT/releases.m.result (original)
+++ cfe/trunk/test/ARCMT/releases.m.result Mon Jul 30 15:52:48 2012
@@ -54,9 +54,6 @@
 @end
 
 @implementation Baz
-- dealloc {
-  return 0;
-}
 @end
 
 void block_test(Foo *p) {

Added: cfe/trunk/test/SemaObjC/dealloc.m
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaObjC/dealloc.m?rev=160993&view=auto
==============================================================================
--- cfe/trunk/test/SemaObjC/dealloc.m (added)
+++ cfe/trunk/test/SemaObjC/dealloc.m Mon Jul 30 15:52:48 2012
@@ -0,0 +1,25 @@
+// RUN: %clang_cc1 -triple x86_64-apple-darwin11 -fsyntax-only -fobjc-arc -fblocks -verify %s
+// RUN: %clang_cc1 -triple x86_64-apple-darwin11 -fsyntax-only -fobjc-arc -fblocks -fdiagnostics-parseable-fixits %s 2>&1 | FileCheck %s
+// rdar://11987838
+
+ at protocol NSObject
+- dealloc; // expected-error {{return type must be correctly specified as 'void' under ARC, instead of 'id'}}
+// CHECK: fix-it:"{{.*}}":{6:3-6:3}:"(void)"
+ at end
+
+ at protocol Foo <NSObject> @end
+
+ at interface Root <Foo>
+ at end
+
+ at interface Baz : Root {
+}
+ at end
+
+ at implementation Baz
+-  (id) dealloc { // expected-error {{return type must be correctly specified as 'void' under ARC, instead of 'id'}}
+// CHECK: fix-it:"{{.*}}":{20:5-20:7}:"void"
+}
+
+ at end
+





More information about the cfe-commits mailing list