r248949 - Don't inherit availability information when implementing a protocol requirement.

Hans Wennborg via cfe-commits cfe-commits at lists.llvm.org
Mon Oct 12 09:25:13 PDT 2015


On Fri, Oct 9, 2015 at 9:10 PM, Douglas Gregor <dgregor at apple.com> wrote:
>
>
> Sent from my iPhone
>
>> On Oct 9, 2015, at 2:17 PM, Hans Wennborg <hans at chromium.org> wrote:
>>
>>> On Fri, Oct 9, 2015 at 1:46 PM, Douglas Gregor <dgregor at apple.com> wrote:
>>>
>>>> On Oct 7, 2015, at 11:55 AM, Hans Wennborg <hans at chromium.org> wrote:
>>>>
>>>> Hi Doug,
>>>>
>>>> On Wed, Sep 30, 2015 at 2:27 PM, Douglas Gregor via cfe-commits
>>>> <cfe-commits at lists.llvm.org> wrote:
>>>>> Author: dgregor
>>>>> Date: Wed Sep 30 16:27:42 2015
>>>>> New Revision: 248949
>>>>>
>>>>> URL: http://llvm.org/viewvc/llvm-project?rev=248949&view=rev
>>>>> Log:
>>>>> Don't inherit availability information when implementing a protocol requirement.
>>>>>
>>>>> When an Objective-C method implements a protocol requirement, do not
>>>>> inherit any availability information from the protocol
>>>>> requirement. Rather, check that the implementation is not less
>>>>> available than the protocol requirement, as we do when overriding a
>>>>> method that has availability. Fixes rdar://problem/22734745.
>>>>
>>>> This is causing new warnings to fire in Chromium, and I'm not sure
>>>> they're correct.
>>>>
>>>> For example:
>>>>
>>>> $ cat | build/bin/clang -c -x objective-c++ -
>>>> #import <Cocoa/Cocoa.h>
>>>> @protocol Foo
>>>> @end
>>>> @interface Bar : NSTextView<Foo> {
>>>> }
>>>> @end
>>>> @implementation Bar
>>>> - (void)setMarkedText:(id)aString selectedRange:(NSRange)selRange {
>>>>   [super setMarkedText:aString selectedRange:selRange];
>>>> }
>>>> @end
>>>> <stdin>:9:10: warning: 'setMarkedText:selectedRange:' is deprecated:
>>>> first deprecated in OS X 10.6 [-Wdeprecated-declarations]
>>>>   [super setMarkedText:aString selectedRange:selRange];
>>>>          ^
>>>> /System/Library/Frameworks/AppKit.framework/Headers/NSInputManager.h:21:1:
>>>> note: 'setMarkedText:selectedRange:' has been explicitly marked
>>>> deprecated here
>>>> - (void) setMarkedText:(id)aString selectedRange:(NSRange)selRange
>>>> NS_DEPRECATED_MAC(10_0, 10_6);
>>>> ^
>>>>
>>>> I don't really know Objective-C, but from what I understand,
>>>> NSTextView implements both NSTextInput and NSTextInputClient.
>>>> setMarkedText is deprecated in the former, but not the latter. So
>>>> warning here is probably wrong?
>>>
>>> The warning is correct. We no longer infer that -[Bar setMarkedText:selectedRange:] is deprecated simply because it matches up with a deprecated requirement in the NSTextView protocol. You can mark this method with
>>>
>>>        NS_DEPRECATED_MAC(10_0, 10_6)
>>>
>>> (i.e., copy the availability information from the protocol requirement) to get the old behavior.
>>
>>
>> Again, apologies for my Objective-C ignorance here, but don't you mean
>> the other way around?
>
> No, I have it correct.
>
>> Before this patch we did not warn that setMarkedText was deprecated,
>> but now we do. It seems we've gone from not inferring that it's
>> deprecated to doing so?
>
> NSTextView's setMarkedText is deprecated. Whether we diagnose a call to a deprecated method depends on the context: inside another deprecated method we suppress the diagnostic.
>
> That's where the inference comes in. We used to (incorrectly) infer that Bar's setMarkedText was deprecated. That's wrong, and it suppressed the deprecated warning for the call to the NSTextView version.

Oh, I see what you're saying. That makes sense. Thanks for explaining!

 - Hans


More information about the cfe-commits mailing list