From: Douglas Gregor Date: Wed, 16 Jan 2013 00:54:48 +0000 (+0000) Subject: One can have an unavailable method overridden by an available method, X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=72daa3f2de226952825f19d7e60a3e9d77ea8c81;p=clang One can have an unavailable method overridden by an available method, but not vice-versa. Fix bug introduced in r172567 and noticed by Jordan, thanks! git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@172586 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/SemaDeclAttr.cpp b/lib/Sema/SemaDeclAttr.cpp index 74a6bc5546..85f48ecff3 100644 --- a/lib/Sema/SemaDeclAttr.cpp +++ b/lib/Sema/SemaDeclAttr.cpp @@ -2057,7 +2057,7 @@ AvailabilityAttr *Sema::mergeAvailabilityAttr(NamedDecl *D, SourceRange Range, !versionsMatch(Deprecated, OldDeprecated, Override) || !versionsMatch(Obsoleted, OldObsoleted, Override) || !(OldIsUnavailable == IsUnavailable || - (Override && OldIsUnavailable && !IsUnavailable))) { + (Override && !OldIsUnavailable && IsUnavailable))) { if (Override) { int Which = -1; VersionTuple FirstVersion; diff --git a/test/SemaObjC/attr-availability.m b/test/SemaObjC/attr-availability.m index 0905733906..bf7ef19bea 100644 --- a/test/SemaObjC/attr-availability.m +++ b/test/SemaObjC/attr-availability.m @@ -11,8 +11,8 @@ - (void)overridden2 __attribute__((availability(macosx,introduced=10.3))); - (void)overridden3 __attribute__((availability(macosx,deprecated=10.3))); - (void)overridden4 __attribute__((availability(macosx,deprecated=10.3))); // expected-note{{overridden method is here}} -- (void)overridden5 __attribute__((availability(macosx,unavailable))); // expected-note{{overridden method is here}} -- (void)overridden6 __attribute__((availability(macosx,introduced=10.3))); +- (void)overridden5 __attribute__((availability(macosx,unavailable))); +- (void)overridden6 __attribute__((availability(macosx,introduced=10.3))); // expected-note{{overridden method is here}} @end // rdar://11475360 @@ -22,8 +22,8 @@ - (void)overridden2 __attribute__((availability(macosx,introduced=10.2))); - (void)overridden3 __attribute__((availability(macosx,deprecated=10.4))); - (void)overridden4 __attribute__((availability(macosx,deprecated=10.2))); // expected-warning{{overriding method deprecated before overridden method on OS X (10.3 vs. 10.2)}} -- (void)overridden5 __attribute__((availability(macosx,introduced=10.3))); // expected-warning{{overriding method cannot be unavailable on OS X when its overridden method is available}} -- (void)overridden6 __attribute__((availability(macosx,unavailable))); +- (void)overridden5 __attribute__((availability(macosx,introduced=10.3))); +- (void)overridden6 __attribute__((availability(macosx,unavailable))); // expected-warning{{overriding method cannot be unavailable on OS X when its overridden method is available}} @end void f(A *a, B *b) {