forked from OSchip/llvm-project
objc: diagnose duplicate declaration of methods
in classes. // rdar://10535349 llvm-svn: 146504
This commit is contained in:
parent
21dc2be97a
commit
c17c86b56c
|
@ -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">;
|
||||
|
|
|
@ -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<
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
@optional
|
||||
- (void) FOO;
|
||||
@optional
|
||||
- (void) FOO;
|
||||
- (void) FOO1;
|
||||
@required
|
||||
- (void) REQ;
|
||||
@optional
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
@optional
|
||||
- (void) FOO;
|
||||
@optional
|
||||
- (void) FOO;
|
||||
- (void) FOO1;
|
||||
@optional
|
||||
- (void) REQ;
|
||||
@optional
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue