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
This commit is contained in:
Chris Lattner 2009-04-11 19:58:42 +00:00
Родитель 273cd4224e
Коммит 3aff919532
7 изменённых файлов: 59 добавлений и 27 удалений

Просмотреть файл

@ -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">;

Просмотреть файл

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

Просмотреть файл

@ -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;
}

Просмотреть файл

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

Просмотреть файл

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

Просмотреть файл

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

Просмотреть файл

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