зеркало из https://github.com/microsoft/clang-1.git
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:
Родитель
273cd4224e
Коммит
3aff919532
|
@ -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
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче