[cfe-commits] r115683 - in /cfe/trunk: lib/Sema/SemaDeclObjC.cpp test/SemaObjC/class-conforming-protocol-2.m test/SemaObjC/comptypes-a.m test/SemaObjC/method-conflict-1.m test/SemaObjC/method-conflict.m

Fariborz Jahanian fjahanian at apple.com
Tue Oct 5 14:02:11 PDT 2010


Author: fjahanian
Date: Tue Oct  5 16:02:11 2010
New Revision: 115683

URL: http://llvm.org/viewvc/llvm-project?rev=115683&view=rev
Log:
Method declaration and its implementation must match in all their types.
Previously, compiler warned only if it was unsafe if types
did not match. Fixes // rdar: //7933061


Added:
    cfe/trunk/test/SemaObjC/method-conflict-1.m
Modified:
    cfe/trunk/lib/Sema/SemaDeclObjC.cpp
    cfe/trunk/test/SemaObjC/class-conforming-protocol-2.m
    cfe/trunk/test/SemaObjC/comptypes-a.m
    cfe/trunk/test/SemaObjC/method-conflict.m

Modified: cfe/trunk/lib/Sema/SemaDeclObjC.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclObjC.cpp?rev=115683&r1=115682&r2=115683&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaDeclObjC.cpp (original)
+++ cfe/trunk/lib/Sema/SemaDeclObjC.cpp Tue Oct  5 16:02:11 2010
@@ -751,10 +751,8 @@
 
 void Sema::WarnConflictingTypedMethods(ObjCMethodDecl *ImpMethodDecl,
                                        ObjCMethodDecl *IntfMethodDecl) {
-  if (!Context.typesAreCompatible(IntfMethodDecl->getResultType(),
-                                  ImpMethodDecl->getResultType()) &&
-      !Context.QualifiedIdConformsQualifiedId(IntfMethodDecl->getResultType(),
-                                              ImpMethodDecl->getResultType())) {
+  if (!Context.hasSameType(IntfMethodDecl->getResultType(),
+                           ImpMethodDecl->getResultType())) {
     Diag(ImpMethodDecl->getLocation(), diag::warn_conflicting_ret_types)
       << ImpMethodDecl->getDeclName() << IntfMethodDecl->getResultType()
       << ImpMethodDecl->getResultType();
@@ -766,8 +764,7 @@
        IM != EM; ++IM, ++IF) {
     QualType ParmDeclTy = (*IF)->getType().getUnqualifiedType();
     QualType ParmImpTy = (*IM)->getType().getUnqualifiedType();
-    if (Context.typesAreCompatible(ParmDeclTy, ParmImpTy) ||
-        Context.QualifiedIdConformsQualifiedId(ParmDeclTy, ParmImpTy))
+    if (Context.hasSameType(ParmDeclTy, ParmImpTy))
       continue;
 
     Diag((*IM)->getLocation(), diag::warn_conflicting_param_types)

Modified: cfe/trunk/test/SemaObjC/class-conforming-protocol-2.m
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaObjC/class-conforming-protocol-2.m?rev=115683&r1=115682&r2=115683&view=diff
==============================================================================
--- cfe/trunk/test/SemaObjC/class-conforming-protocol-2.m (original)
+++ cfe/trunk/test/SemaObjC/class-conforming-protocol-2.m Tue Oct  5 16:02:11 2010
@@ -3,8 +3,8 @@
 @protocol NSWindowDelegate @end
 
 @interface NSWindow
-- (void)setDelegate:(id <NSWindowDelegate>)anObject;
-- (id <NSWindowDelegate>) delegate;
+- (void)setDelegate:(id <NSWindowDelegate>)anObject; // expected-note {{previous definition is here}}
+- (id <NSWindowDelegate>) delegate; // expected-note {{previous definition is here}}
 @end
 
 @protocol IBStringsTableWindowDelegate <NSWindowDelegate>
@@ -14,9 +14,9 @@
 @end
 
 @implementation IBStringsTableWindow
-- (void)setDelegate:(id <IBStringsTableWindowDelegate>)delegate {
+- (void)setDelegate:(id <IBStringsTableWindowDelegate>)delegate { // expected-warning {{conflicting parameter types in implementation of 'setDelegate:'}}
 }
-- (id <IBStringsTableWindowDelegate>)delegate {
+- (id <IBStringsTableWindowDelegate>)delegate { // expected-warning {{conflicting return type in implementation of 'delegate':}}
         return 0;
 }
 @end

Modified: cfe/trunk/test/SemaObjC/comptypes-a.m
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaObjC/comptypes-a.m?rev=115683&r1=115682&r2=115683&view=diff
==============================================================================
--- cfe/trunk/test/SemaObjC/comptypes-a.m (original)
+++ cfe/trunk/test/SemaObjC/comptypes-a.m Tue Oct  5 16:02:11 2010
@@ -18,7 +18,8 @@
 
 @interface TedWantsToVerifyObjCDoesTheRightThing
 
-- compareThis:(int)a withThat:(id)b;  // expected-note {{previous definition is here}}
+- compareThis:(int)a withThat:(id)b;  // expected-note {{previous definition is here}} \
+				      // expected-note {{previous definition is here}}
 
 @end
 
@@ -26,7 +27,7 @@
 
 - compareThis:(id<PBXCompletionItem>)
     a // expected-warning {{conflicting parameter types in implementation of 'compareThis:withThat:': 'int' vs 'id<PBXCompletionItem>'}}
-     withThat:(id<PBXCompletionItem>)b {
+     withThat:(id<PBXCompletionItem>)b { // expected-warning {{conflicting parameter types in implementation of 'compareThis:withThat:': 'id' vs 'id<PBXCompletionItem>'}}
   return self;
 }
 

Added: cfe/trunk/test/SemaObjC/method-conflict-1.m
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaObjC/method-conflict-1.m?rev=115683&view=auto
==============================================================================
--- cfe/trunk/test/SemaObjC/method-conflict-1.m (added)
+++ cfe/trunk/test/SemaObjC/method-conflict-1.m Tue Oct  5 16:02:11 2010
@@ -0,0 +1,35 @@
+// RUN: %clang_cc1 -fsyntax-only -verify %s
+// rdar://7933061
+
+ at interface NSObject @end
+
+ at interface NSArray : NSObject @end
+
+ at interface MyClass : NSObject {
+}
+- (void)myMethod:(NSArray *)object; // expected-note {{previous definition is here}}
+- (void)myMethod1:(NSObject *)object; // expected-note {{previous definition is here}}
+ at end
+
+ at implementation MyClass
+- (void)myMethod:(NSObject *)object { // expected-warning {{conflicting parameter types in implementation of 'myMethod:': 'NSArray *' vs 'NSObject *'}}
+}
+- (void)myMethod1:(NSArray *)object { // expected-warning {{conflicting parameter types in implementation of 'myMethod1:': 'NSObject *' vs 'NSArray *'}}
+}
+ at end
+
+
+ at protocol MyProtocol @end
+
+ at interface MyOtherClass : NSObject <MyProtocol> {
+}
+- (void)myMethod:(id <MyProtocol>)object; // expected-note {{previous definition is here}}
+- (void)myMethod1:(id <MyProtocol>)object; // expected-note {{previous definition is here}}
+ at end
+
+ at implementation MyOtherClass
+- (void)myMethod:(MyClass *)object { // expected-warning {{conflicting parameter types in implementation of 'myMethod:': 'id<MyProtocol>' vs 'MyClass *'}}
+}
+- (void)myMethod1:(MyClass<MyProtocol> *)object { // expected-warning {{conflicting parameter types in implementation of 'myMethod1:': 'id<MyProtocol>' vs 'MyClass<MyProtocol> *'}}
+}
+ at end

Modified: cfe/trunk/test/SemaObjC/method-conflict.m
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaObjC/method-conflict.m?rev=115683&r1=115682&r2=115683&view=diff
==============================================================================
--- cfe/trunk/test/SemaObjC/method-conflict.m (original)
+++ cfe/trunk/test/SemaObjC/method-conflict.m Tue Oct  5 16:02:11 2010
@@ -40,7 +40,7 @@
 @end  @class XDSCOperation;
 @interface XDSCClassFormatter : NSObject {
 }
-+ (NSUInteger) compartmentsForClassifier: (id <XDUMLClassifier>) classifier withSpecification: (XDSCDisplaySpecification *) displaySpec; 
++ (NSUInteger) compartmentsForClassifier: (id <XDUMLClassifier>) classifier withSpecification: (XDSCDisplaySpecification *) displaySpec;  // expected-note {{previous definition is here}}
 @end  
 @class NSString;
 @implementation XDSCClassFormatter       
@@ -49,7 +49,7 @@
 {
   return 0;
 }
-+ (NSUInteger) compartmentsForClassifier: (id <XDSCClassifier>) classifier withSpecification: (XDSCDisplaySpecification *) displaySpec {
++ (NSUInteger) compartmentsForClassifier: (id <XDSCClassifier>) classifier withSpecification: (XDSCDisplaySpecification *) displaySpec { // expected-warning {{conflicting parameter types in implementation of 'compartmentsForClassifier:withSpecification:'}}
   return 0;
 }
 @end 





More information about the cfe-commits mailing list