diff options
author | Akira Hatanaka <ahatanaka@apple.com> | 2018-02-06 23:44:40 +0000 |
---|---|---|
committer | Akira Hatanaka <ahatanaka@apple.com> | 2018-02-06 23:44:40 +0000 |
commit | 4c687f38c6369de9ad2fe734b99abd743fa60026 (patch) | |
tree | 9f17175b6dab58cdf8ed815e4cf029f7623eb1a6 | |
parent | cd07a3e2f9e7c35e90f82bc33cfec0be59c27568 (diff) | |
download | bcm5719-llvm-4c687f38c6369de9ad2fe734b99abd743fa60026.tar.gz bcm5719-llvm-4c687f38c6369de9ad2fe734b99abd743fa60026.zip |
[Sema][ObjC] Use SmallSetVector to fix a failing test on the reverse
iteration bot.
This commit reverts r315639, which was causing clang to print
diagnostics that weren't printed before. Instead, it declares
OverrideSearch::Overridden as a SmallSetVector to fix the
non-deterministic behavior r315639 was trying to fix.
rdar://problem/36445528
llvm-svn: 324425
-rw-r--r-- | clang/lib/Sema/SemaDecl.cpp | 2 | ||||
-rw-r--r-- | clang/lib/Sema/SemaDeclObjC.cpp | 8 | ||||
-rw-r--r-- | clang/test/SemaObjC/arc-decls.m | 22 |
3 files changed, 26 insertions, 6 deletions
diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp index c3975f9f62d..b70e2306ca2 100644 --- a/clang/lib/Sema/SemaDecl.cpp +++ b/clang/lib/Sema/SemaDecl.cpp @@ -3623,6 +3623,8 @@ void Sema::mergeObjCMethodDecls(ObjCMethodDecl *newMethod, ni = newMethod->param_begin(), ne = newMethod->param_end(); ni != ne && oi != oe; ++ni, ++oi) mergeParamDeclAttributes(*ni, *oi, *this); + + CheckObjCMethodOverride(newMethod, oldMethod); } static void diagnoseVarDeclTypeMismatch(Sema &S, VarDecl *New, VarDecl* Old) { diff --git a/clang/lib/Sema/SemaDeclObjC.cpp b/clang/lib/Sema/SemaDeclObjC.cpp index d44b5f357df..c17fde497ae 100644 --- a/clang/lib/Sema/SemaDeclObjC.cpp +++ b/clang/lib/Sema/SemaDeclObjC.cpp @@ -4133,7 +4133,7 @@ class OverrideSearch { public: Sema &S; ObjCMethodDecl *Method; - llvm::SmallPtrSet<ObjCMethodDecl*, 4> Overridden; + llvm::SmallSetVector<ObjCMethodDecl*, 4> Overridden; bool Recursive; public: @@ -4170,7 +4170,7 @@ public: } } - typedef llvm::SmallPtrSetImpl<ObjCMethodDecl*>::iterator iterator; + typedef decltype(Overridden)::iterator iterator; iterator begin() const { return Overridden.begin(); } iterator end() const { return Overridden.end(); } @@ -4338,10 +4338,6 @@ void Sema::CheckObjCMethodOverrides(ObjCMethodDecl *ObjCMethod, // Then merge the declarations. mergeObjCMethodDecls(ObjCMethod, overridden); - } - - for (ObjCMethodDecl *overridden : overrides) { - CheckObjCMethodOverride(ObjCMethod, overridden); if (ObjCMethod->isImplicit() && overridden->isImplicit()) continue; // Conflicting properties are detected elsewhere. diff --git a/clang/test/SemaObjC/arc-decls.m b/clang/test/SemaObjC/arc-decls.m index c1c319d95e3..15fb78be089 100644 --- a/clang/test/SemaObjC/arc-decls.m +++ b/clang/test/SemaObjC/arc-decls.m @@ -154,3 +154,25 @@ struct __attribute__((objc_ownership(none))) S2 {}; // expected-error {{'objc_ow @property (readwrite, weak) ControllerClass *weak_controller; @end + +@interface I3 +@end + +@interface D3 : I3 +@end + +@interface D3 (Cat1) +- (id)method; +@end + +@interface I3 (Cat2) +// FIXME: clang should diagnose mismatch between methods in D3(Cat1) and +// I3(Cat2). +- (id)method __attribute__((ns_returns_retained)); +@end + +@implementation D3 +- (id)method { + return (id)0; +} +@end |