diff options
author | Chris Lattner <sabre@nondot.org> | 2009-04-11 19:58:42 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2009-04-11 19:58:42 +0000 |
commit | 3aff919532fd807ed678b9cfa4b7eca7b04adcf9 (patch) | |
tree | 247056e26e315ffc9acbdf60058abb24aba82d49 | |
parent | 273cd4224e13dab6bf738183ace8f93f914ec95c (diff) |
improve the 'conflicting types' diagnostics to include correct location info, now
that it is plumbed through Sema. On a file from growl, we used to emit:
t.mi:107059:1: warning: conflicting types for 'removePluginHandler:forPluginTypes:'
- (void) removePluginHandler:(id <GrowlPluginHandler>)handler forPluginTypes:(NSSet *)extensions {
^
t.mi:105280:1: note: previous definition is here
- (void) removePluginHandler:(id <NSObject>)handler forPluginTypes:(NSSet *)types;
^
now we produce:
t.mi:107059:55: warning: conflicting parameter types in implementation of 'removePluginHandler:forPluginTypes:': 'id<NSObject>' vs 'id<GrowlPluginHandler>'
- (void) removePluginHandler:(id <GrowlPluginHandler>)handler forPluginTypes:(NSSet *)extensions {
^
t.mi:105280:45: note: previous definition is here
- (void) removePluginHandler:(id <NSObject>)handler forPluginTypes:(NSSet *)types;
^
We still don't have proper loc info for properties, hence the FIXME.
rdar://6782494
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@68879 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | include/clang/Basic/DiagnosticSemaKinds.td | 8 | ||||
-rw-r--r-- | lib/Sema/SemaDeclObjC.cpp | 35 | ||||
-rw-r--r-- | test/SemaObjC/comptypes-a.m | 4 | ||||
-rw-r--r-- | test/SemaObjC/method-conflict.m | 2 | ||||
-rw-r--r-- | test/SemaObjC/method-def-1.m | 19 | ||||
-rw-r--r-- | test/SemaObjC/method-typecheck-1.m | 16 | ||||
-rw-r--r-- | test/SemaObjC/property-typecheck-1.m | 2 |
7 files changed, 59 insertions, 27 deletions
diff --git a/include/clang/Basic/DiagnosticSemaKinds.td b/include/clang/Basic/DiagnosticSemaKinds.td index 1ed8098ad3..5b3ecb9299 100644 --- a/include/clang/Basic/DiagnosticSemaKinds.td +++ b/include/clang/Basic/DiagnosticSemaKinds.td @@ -158,7 +158,13 @@ def err_inconsistant_ivar_count : Error< "inconsistent number of instance variables specified">; def warn_incomplete_impl : Warning<"incomplete implementation">; def warn_undef_method_impl : Warning<"method definition for %0 not found">; -def warn_conflicting_types : Warning<"conflicting types for %0">; + +def warn_conflicting_ret_types : Warning< + "conflicting return type in implementation of %0: %1 vs %2">; + +def warn_conflicting_param_types : Warning< + "conflicting parameter types in implementation of %0: %1 vs %2">; + def warn_multiple_method_decl : Warning<"multiple methods named %0 found">; def err_accessor_property_type_mismatch : Error< "type of property %0 does not match type of accessor %1">; diff --git a/lib/Sema/SemaDeclObjC.cpp b/lib/Sema/SemaDeclObjC.cpp index 52b6db59f3..6048901e7a 100644 --- a/lib/Sema/SemaDeclObjC.cpp +++ b/lib/Sema/SemaDeclObjC.cpp @@ -763,25 +763,28 @@ void Sema::WarnUndefinedMethod(SourceLocation ImpLoc, ObjCMethodDecl *method, void Sema::WarnConflictingTypedMethods(ObjCMethodDecl *ImpMethodDecl, ObjCMethodDecl *IntfMethodDecl) { - bool err = false; if (!Context.typesAreCompatible(IntfMethodDecl->getResultType(), - ImpMethodDecl->getResultType())) - err = true; - else - for (ObjCMethodDecl::param_iterator IM=ImpMethodDecl->param_begin(), - IF = IntfMethodDecl->param_begin(), EM = ImpMethodDecl->param_end(); - IM != EM; ++IM, ++IF) { - if (!Context.typesAreCompatible((*IF)->getType(), (*IM)->getType())) { - err = true; - break; - } - } - - if (err) { - Diag(ImpMethodDecl->getLocation(), diag::warn_conflicting_types) - << ImpMethodDecl->getDeclName(); + ImpMethodDecl->getResultType())) { + Diag(ImpMethodDecl->getLocation(), diag::warn_conflicting_ret_types) + << ImpMethodDecl->getDeclName() << IntfMethodDecl->getResultType() + << ImpMethodDecl->getResultType(); Diag(IntfMethodDecl->getLocation(), diag::note_previous_definition); } + + for (ObjCMethodDecl::param_iterator IM = ImpMethodDecl->param_begin(), + IF = IntfMethodDecl->param_begin(), EM = ImpMethodDecl->param_end(); + IM != EM; ++IM, ++IF) { + if (Context.typesAreCompatible((*IF)->getType(), (*IM)->getType())) + continue; + + Diag((*IM)->getLocation(), diag::warn_conflicting_param_types) + << ImpMethodDecl->getDeclName() << (*IF)->getType() + << (*IM)->getType(); + SourceLocation Loc = (*IF)->getLocation(); + // FIXME + if (Loc == SourceLocation()) Loc = IntfMethodDecl->getLocation(); + Diag(Loc, diag::note_previous_definition); + } } /// isPropertyReadonly - Return true if property is readonly, by searching diff --git a/test/SemaObjC/comptypes-a.m b/test/SemaObjC/comptypes-a.m index ccbadf69ad..936c6dfc5d 100644 --- a/test/SemaObjC/comptypes-a.m +++ b/test/SemaObjC/comptypes-a.m @@ -23,7 +23,9 @@ NSInteger codeAssistantCaseCompareItems(id<PBXCompletionItem> a, id<PBXCompletio @implementation TedWantsToVerifyObjCDoesTheRightThing -- compareThis:(id<PBXCompletionItem>)a withThat:(id<PBXCompletionItem>)b { // expected-warning {{conflicting types for 'compareThis:withThat:'}} +- compareThis:(id<PBXCompletionItem>) + a // expected-warning {{conflicting parameter types in implementation of 'compareThis:withThat:': 'int' vs 'id<PBXCompletionItem>'}} + withThat:(id<PBXCompletionItem>)b { return self; } diff --git a/test/SemaObjC/method-conflict.m b/test/SemaObjC/method-conflict.m index 042aed9284..957cde3c26 100644 --- a/test/SemaObjC/method-conflict.m +++ b/test/SemaObjC/method-conflict.m @@ -49,6 +49,6 @@ typedef NSUInteger XDSourceLanguage; { } // GCC doesn't currently warn about this. -+ (NSUInteger) compartmentsForClassifier: (id <XDSCClassifier>) classifier withSpecification: (XDSCDisplaySpecification *) displaySpec { // expected-warning {{conflicting types for 'compartmentsForClassifier:withSpecification:'}} ++ (NSUInteger) compartmentsForClassifier: (id <XDSCClassifier>) classifier withSpecification: (XDSCDisplaySpecification *) displaySpec { // expected-warning {{conflicting parameter types in implementation of 'compartmentsForClassifier:withSpecification:': 'id<XDUMLClassifier>' vs 'id<XDSCClassifier>'}} } @end diff --git a/test/SemaObjC/method-def-1.m b/test/SemaObjC/method-def-1.m index 94194053e1..3eb94b9153 100644 --- a/test/SemaObjC/method-def-1.m +++ b/test/SemaObjC/method-def-1.m @@ -17,5 +17,24 @@ @implementation MyClass - (void)myMethod { } - (vid)myMethod2 { } // expected-error {{expected a type}} + +@end + + +@protocol proto; +@protocol NSObject; + +//@protocol GrowlPluginHandler <NSObject> @end + + +@interface SomeClass2 +- (int)myMethod1: (id<proto>) +arg; // expected-note {{previous definition is here}} @end +@implementation SomeClass2 +- (int)myMethod1: (id<NSObject>) + arg { // expected-warning {{conflicting parameter types in implementation of 'myMethod1:': 'id<proto>' vs 'id<NSObject>'}} + +} +@end diff --git a/test/SemaObjC/method-typecheck-1.m b/test/SemaObjC/method-typecheck-1.m index aba0befb7f..d110c858a4 100644 --- a/test/SemaObjC/method-typecheck-1.m +++ b/test/SemaObjC/method-typecheck-1.m @@ -7,29 +7,31 @@ @end @implementation A --(void) setMoo: (float) x {} // expected-warning {{conflicting types for 'setMoo:'}} -- (char) setMoo1: (int) x {} // expected-warning {{conflicting types for 'setMoo1:'}} +-(void) setMoo: (float) x {} // expected-warning {{conflicting parameter types in implementation of 'setMoo:': 'int' vs 'float'}} +- (char) setMoo1: (int) x {} // expected-warning {{conflicting return type in implementation of 'setMoo1:': 'int' vs 'char'}} - (int) setOk : (int) x : (double) d {} @end @interface C -+ (void) cMoo: (int) x; // expected-note {{previous definition is here}} ++ (void) cMoo: (int) x; // expected-note 2 {{previous definition is here}} @end @implementation C -+(float) cMoo: (float) x {} // expected-warning {{conflicting types for 'cMoo:'}} ++(float) cMoo: // expected-warning {{conflicting return type in implementation of 'cMoo:': 'void' vs 'float'}} + (float) x {} // expected-warning {{conflicting parameter types in implementation of 'cMoo:': 'int' vs 'float'}} @end @interface A(CAT) -- (void) setCat: (int) x; // expected-note {{previous definition is here}} +- (void) setCat: (int) x; // expected-note 2 {{previous definition is here}} + (void) cCat: (int) x; // expected-note {{previous definition is here}} @end @implementation A(CAT) --(float) setCat: (float) x {} // expected-warning {{conflicting types for 'setCat:'}} -+ (int) cCat: (int) x {} // expected-warning {{conflicting types for 'cCat:'}} +-(float) setCat: // expected-warning {{conflicting return type in implementation of 'setCat:': 'void' vs 'float'}} +(float) x {} // expected-warning {{conflicting parameter types in implementation of 'setCat:': 'int' vs 'float'}} ++ (int) cCat: (int) x {} // expected-warning {{conflicting return type in implementation of 'cCat:': 'void' vs 'int'}} @end diff --git a/test/SemaObjC/property-typecheck-1.m b/test/SemaObjC/property-typecheck-1.m index 22e5e4af66..1795da8599 100644 --- a/test/SemaObjC/property-typecheck-1.m +++ b/test/SemaObjC/property-typecheck-1.m @@ -13,7 +13,7 @@ -(int) moo { return 0; } --(void) setMoo: (float) x { // expected-warning {{conflicting types for 'setMoo:'}} +-(void) setMoo: (float) x { // expected-warning {{conflicting parameter types in implementation of 'setMoo:': 'int' vs 'float'}} } @end |