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 InvalidOffsetof : DiagGroup<"invalid-offsetof">;
|
||||||
def : DiagGroup<"strict-prototypes">;
|
def : DiagGroup<"strict-prototypes">;
|
||||||
def StrictSelector : DiagGroup<"strict-selector-match">;
|
def StrictSelector : DiagGroup<"strict-selector-match">;
|
||||||
|
def MethodDuplicate : DiagGroup<"duplicate-method-match">;
|
||||||
def SwitchEnum : DiagGroup<"switch-enum">;
|
def SwitchEnum : DiagGroup<"switch-enum">;
|
||||||
def Switch : DiagGroup<"switch", [SwitchEnum]>;
|
def Switch : DiagGroup<"switch", [SwitchEnum]>;
|
||||||
def Trigraphs : DiagGroup<"trigraphs">;
|
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 note_method_declared_at : Note<"method declared here">;
|
||||||
def err_setter_type_void : Error<"type of setter must be void">;
|
def err_setter_type_void : Error<"type of setter must be void">;
|
||||||
def err_duplicate_method_decl : Error<"duplicate declaration of method %0">;
|
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 :
|
def err_objc_var_decl_inclass :
|
||||||
Error<"cannot declare variable inside @interface or @protocol">;
|
Error<"cannot declare variable inside @interface or @protocol">;
|
||||||
def error_missing_method_context : Error<
|
def error_missing_method_context : Error<
|
||||||
|
|
|
@ -2210,8 +2210,14 @@ Decl *Sema::ActOnAtEnd(Scope *S, SourceRange AtEnd,
|
||||||
Diag(PrevMethod->getLocation(), diag::note_previous_declaration);
|
Diag(PrevMethod->getLocation(), diag::note_previous_declaration);
|
||||||
Method->setInvalidDecl();
|
Method->setInvalidDecl();
|
||||||
} else {
|
} else {
|
||||||
if (PrevMethod)
|
if (PrevMethod) {
|
||||||
Method->setAsRedeclaration(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;
|
InsMap[Method->getSelector()] = Method;
|
||||||
/// The following allows us to typecheck messages to "id".
|
/// The following allows us to typecheck messages to "id".
|
||||||
AddInstanceMethodToGlobalPool(Method);
|
AddInstanceMethodToGlobalPool(Method);
|
||||||
|
@ -2231,8 +2237,14 @@ Decl *Sema::ActOnAtEnd(Scope *S, SourceRange AtEnd,
|
||||||
Diag(PrevMethod->getLocation(), diag::note_previous_declaration);
|
Diag(PrevMethod->getLocation(), diag::note_previous_declaration);
|
||||||
Method->setInvalidDecl();
|
Method->setInvalidDecl();
|
||||||
} else {
|
} else {
|
||||||
if (PrevMethod)
|
if (PrevMethod) {
|
||||||
Method->setAsRedeclaration(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;
|
ClsMap[Method->getSelector()] = Method;
|
||||||
/// The following allows us to typecheck messages to "Class".
|
/// The following allows us to typecheck messages to "Class".
|
||||||
AddFactoryMethodToGlobalPool(Method);
|
AddFactoryMethodToGlobalPool(Method);
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
@optional
|
@optional
|
||||||
- (void) FOO;
|
- (void) FOO;
|
||||||
@optional
|
@optional
|
||||||
- (void) FOO;
|
- (void) FOO1;
|
||||||
@required
|
@required
|
||||||
- (void) REQ;
|
- (void) REQ;
|
||||||
@optional
|
@optional
|
||||||
|
|
|
@ -5,8 +5,8 @@
|
||||||
int ivar;
|
int ivar;
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void) method;
|
- (void) method; // expected-note {{previous declaration is here}}
|
||||||
- (void) method;
|
- (void) method; // expected-warning {{multiple declarations of method 'method' found and ignored}}
|
||||||
@end
|
@end
|
||||||
|
|
||||||
@implementation Subclass
|
@implementation Subclass
|
||||||
|
|
|
@ -10,8 +10,8 @@
|
||||||
@interface class1 : SUPER
|
@interface class1 : SUPER
|
||||||
- (int) meth; // expected-note {{previous declaration is here}}
|
- (int) meth; // expected-note {{previous declaration is here}}
|
||||||
- (int*) meth; // expected-error {{duplicate declaration of method 'meth'}}
|
- (int*) meth; // expected-error {{duplicate declaration of method 'meth'}}
|
||||||
- (T*) meth1;
|
- (T*) meth1; // expected-note {{previous declaration is here}}
|
||||||
- (T*) meth1;
|
- (T*) meth1; // expected-warning {{multiple declarations of method 'meth1' found and ignored}}
|
||||||
+ (T*) meth1;
|
+ (T*) meth1;
|
||||||
@end
|
@end
|
||||||
|
|
||||||
|
|
|
@ -8,12 +8,11 @@
|
||||||
- (INTF*) METH1; // expected-note {{previous declaration is here}}
|
- (INTF*) METH1; // expected-note {{previous declaration is here}}
|
||||||
- (INTF<P1>*) METH1; // expected-error {{duplicate declaration of method 'METH1'}}
|
- (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>*) METH2; // expected-note {{previous declaration is here}}
|
||||||
- (INTF<P2,P1,P3>*) METH2; // expected-error {{duplicate declaration of method 'METH2'}}
|
- (INTF<P2,P1,P3>*) METH2; // expected-error {{duplicate declaration of method 'METH2'}}
|
||||||
|
|
||||||
- (INTF<P2,P1,P3>*) METH3;
|
- (INTF<P2,P1,P3>*) METH3; // expected-note {{previous declaration is here}}
|
||||||
- (INTF<P3,P1,P2, P3>*) METH3;
|
- (INTF<P3,P1,P2, P3>*) METH3; // expected-warning {{multiple declarations of method 'METH3' found and ignored}}
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
@optional
|
@optional
|
||||||
- (void) FOO;
|
- (void) FOO;
|
||||||
@optional
|
@optional
|
||||||
- (void) FOO;
|
- (void) FOO1;
|
||||||
@optional
|
@optional
|
||||||
- (void) REQ;
|
- (void) REQ;
|
||||||
@optional
|
@optional
|
||||||
|
|
|
@ -5,5 +5,5 @@
|
||||||
|
|
||||||
@interface T
|
@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>*) meth; // expected-error {{cannot find protocol declaration for 'p3'}}
|
- (T<p2, p3, p1, p4>*) meth1; // expected-error {{cannot find protocol declaration for 'p3'}}
|
||||||
@end
|
@end
|
||||||
|
|
Loading…
Reference in New Issue