objc: diagnose duplicate declaration of methods

in classes. // rdar://10535349

llvm-svn: 146504
This commit is contained in:
Fariborz Jahanian 2011-12-13 19:40:34 +00:00
parent 21dc2be97a
commit c17c86b56c
9 changed files with 27 additions and 12 deletions

View File

@ -174,6 +174,7 @@ def : DiagGroup<"strict-overflow">;
def InvalidOffsetof : DiagGroup<"invalid-offsetof">;
def : DiagGroup<"strict-prototypes">;
def StrictSelector : DiagGroup<"strict-selector-match">;
def MethodDuplicate : DiagGroup<"duplicate-method-match">;
def SwitchEnum : DiagGroup<"switch-enum">;
def Switch : DiagGroup<"switch", [SwitchEnum]>;
def Trigraphs : DiagGroup<"trigraphs">;

View File

@ -488,6 +488,9 @@ def warn_accessor_property_type_mismatch : Warning<
def note_method_declared_at : Note<"method declared here">;
def err_setter_type_void : Error<"type of setter must be void">;
def err_duplicate_method_decl : Error<"duplicate declaration of method %0">;
def warn_duplicate_method_decl :
Warning<"multiple declarations of method %0 found and ignored">,
InGroup<MethodDuplicate>;
def err_objc_var_decl_inclass :
Error<"cannot declare variable inside @interface or @protocol">;
def error_missing_method_context : Error<

View File

@ -2210,8 +2210,14 @@ Decl *Sema::ActOnAtEnd(Scope *S, SourceRange AtEnd,
Diag(PrevMethod->getLocation(), diag::note_previous_declaration);
Method->setInvalidDecl();
} else {
if (PrevMethod)
if (PrevMethod) {
Method->setAsRedeclaration(PrevMethod);
if (!Context.getSourceManager().isInSystemHeader(
Method->getLocation()))
Diag(Method->getLocation(), diag::warn_duplicate_method_decl)
<< Method->getDeclName();
Diag(PrevMethod->getLocation(), diag::note_previous_declaration);
}
InsMap[Method->getSelector()] = Method;
/// The following allows us to typecheck messages to "id".
AddInstanceMethodToGlobalPool(Method);
@ -2231,8 +2237,14 @@ Decl *Sema::ActOnAtEnd(Scope *S, SourceRange AtEnd,
Diag(PrevMethod->getLocation(), diag::note_previous_declaration);
Method->setInvalidDecl();
} else {
if (PrevMethod)
if (PrevMethod) {
Method->setAsRedeclaration(PrevMethod);
if (!Context.getSourceManager().isInSystemHeader(
Method->getLocation()))
Diag(Method->getLocation(), diag::warn_duplicate_method_decl)
<< Method->getDeclName();
Diag(PrevMethod->getLocation(), diag::note_previous_declaration);
}
ClsMap[Method->getSelector()] = Method;
/// The following allows us to typecheck messages to "Class".
AddFactoryMethodToGlobalPool(Method);

View File

@ -4,7 +4,7 @@
@optional
- (void) FOO;
@optional
- (void) FOO;
- (void) FOO1;
@required
- (void) REQ;
@optional

View File

@ -5,8 +5,8 @@
int ivar;
}
- (void) method;
- (void) method;
- (void) method; // expected-note {{previous declaration is here}}
- (void) method; // expected-warning {{multiple declarations of method 'method' found and ignored}}
@end
@implementation Subclass

View File

@ -10,8 +10,8 @@
@interface class1 : SUPER
- (int) meth; // expected-note {{previous declaration is here}}
- (int*) meth; // expected-error {{duplicate declaration of method 'meth'}}
- (T*) meth1;
- (T*) meth1;
- (T*) meth1; // expected-note {{previous declaration is here}}
- (T*) meth1; // expected-warning {{multiple declarations of method 'meth1' found and ignored}}
+ (T*) meth1;
@end

View File

@ -8,12 +8,11 @@
- (INTF*) METH1; // expected-note {{previous declaration is here}}
- (INTF<P1>*) METH1; // expected-error {{duplicate declaration of method 'METH1'}}
- (INTF<P1,P2>*) METH2;
- (INTF<P2,P1>*) METH2; // expected-note {{previous declaration is here}}
- (INTF<P2,P1,P3>*) METH2; // expected-error {{duplicate declaration of method 'METH2'}}
- (INTF<P2,P1,P3>*) METH3;
- (INTF<P3,P1,P2, P3>*) METH3;
- (INTF<P2,P1,P3>*) METH3; // expected-note {{previous declaration is here}}
- (INTF<P3,P1,P2, P3>*) METH3; // expected-warning {{multiple declarations of method 'METH3' found and ignored}}
@end

View File

@ -4,7 +4,7 @@
@optional
- (void) FOO;
@optional
- (void) FOO;
- (void) FOO1;
@optional
- (void) REQ;
@optional

View File

@ -5,5 +5,5 @@
@interface T
- (T<p2, p3, p1, p4>*) meth; // expected-error {{cannot find protocol declaration for 'p3'}}
- (T<p2, p3, p1, p4>*) meth; // expected-error {{cannot find protocol declaration for 'p3'}}
- (T<p2, p3, p1, p4>*) meth1; // expected-error {{cannot find protocol declaration for 'p3'}}
@end