<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><br class=""><div><blockquote type="cite" class=""><div class="">On Feb 18, 2016, at 7:16 AM, Duncan P. N. Exon Smith via cfe-commits <<a href="mailto:cfe-commits@lists.llvm.org" class="">cfe-commits@lists.llvm.org</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><blockquote type="cite" style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><br class="Apple-interchange-newline">On 2016-Feb-17, at 14:05, Manman Ren via cfe-commits <<a href="mailto:cfe-commits@lists.llvm.org" class="">cfe-commits@lists.llvm.org</a>> wrote:<br class=""><br class="">Author: mren<br class="">Date: Wed Feb 17 16:05:48 2016<br class="">New Revision: 261163<br class=""><br class="">URL: <a href="http://llvm.org/viewvc/llvm-project?rev=261163&view=rev" class="">http://llvm.org/viewvc/llvm-project?rev=261163&view=rev</a><br class="">Log:<br class="">Add 'nopartial' qualifier for availability attributes.<br class=""><br class="">An optional nopartial can be placed after the platform name.<br class="">int bar() __attribute__((availability(macosx,nopartial,introduced=10.12))<br class=""><br class="">When deploying back to a platform version prior to when the declaration was<br class="">introduced, with 'nopartial', Clang emits an error specifying that the function<br class="">is not introduced yet; without 'nopartial', the behavior stays the same: the<br class="">declaration is `weakly linked`.<br class=""><br class="">A member is added to the end of AttributeList to save the location of the<br class="">'nopartial' keyword. A bool member is added to AvailabilityAttr.<br class=""><br class="">The diagnostics for 'nopartial' not-yet-introduced is handled in the same way as<br class="">we handle unavailable cases.<br class=""><br class="">Reviewed by Doug Gregor and Jordan Rose.<br class=""><br class=""><a href="rdar://23791325" class="">rdar://23791325</a><br class=""><br class="">Modified:<br class=""> cfe/trunk/include/clang/Basic/Attr.td<br class=""> cfe/trunk/include/clang/Basic/AttrDocs.td<br class=""> cfe/trunk/include/clang/Basic/DiagnosticGroups.td<br class=""> cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td<br class=""> cfe/trunk/include/clang/Parse/Parser.h<br class=""> cfe/trunk/include/clang/Sema/AttributeList.h<br class=""> cfe/trunk/include/clang/Sema/DelayedDiagnostic.h<br class=""> cfe/trunk/include/clang/Sema/Sema.h<br class=""> cfe/trunk/lib/Parse/ParseDecl.cpp<br class=""> cfe/trunk/lib/Parse/Parser.cpp<br class=""> cfe/trunk/lib/Sema/DelayedDiagnostic.cpp<br class=""> cfe/trunk/lib/Sema/SemaDecl.cpp<br class=""> cfe/trunk/lib/Sema/SemaDeclAttr.cpp<br class=""> cfe/trunk/lib/Sema/SemaExpr.cpp<br class=""> cfe/trunk/test/Sema/attr-availability-macosx.c<br class=""><br class="">Modified: cfe/trunk/include/clang/Basic/Attr.td<br class="">URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/Attr.td?rev=261163&r1=261162&r2=261163&view=diff<br class="">==============================================================================<br class="">--- cfe/trunk/include/clang/Basic/Attr.td (original)<br class="">+++ cfe/trunk/include/clang/Basic/Attr.td Wed Feb 17 16:05:48 2016<br class="">@@ -450,7 +450,8 @@ def Availability : InheritableAttr {<br class=""> let Spellings = [GNU<"availability">];<br class=""> let Args = [IdentifierArgument<"platform">, VersionArgument<"introduced">,<br class=""> VersionArgument<"deprecated">, VersionArgument<"obsoleted">,<br class="">- BoolArgument<"unavailable">, StringArgument<"message">];<br class="">+ BoolArgument<"unavailable">, StringArgument<"message">,<br class="">+ BoolArgument<"nopartial">];<br class=""> let AdditionalMembers =<br class="">[{static llvm::StringRef getPrettyPlatformName(llvm::StringRef Platform) {<br class=""> return llvm::StringSwitch<llvm::StringRef>(Platform)<br class=""><br class="">Modified: cfe/trunk/include/clang/Basic/AttrDocs.td<br class="">URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/AttrDocs.td?rev=261163&r1=261162&r2=261163&view=diff<br class="">==============================================================================<br class="">--- cfe/trunk/include/clang/Basic/AttrDocs.td (original)<br class="">+++ cfe/trunk/include/clang/Basic/AttrDocs.td Wed Feb 17 16:05:48 2016<br class="">@@ -685,9 +685,14 @@ are:<br class=""> Apple's watchOS operating system. The minimum deployment target is specified by<br class=""> the ``-mwatchos-version-min=*version*`` command-line argument.<br class=""><br class="">-A declaration can be used even when deploying back to a platform version prior<br class="">-to when the declaration was introduced. When this happens, the declaration is<br class="">-`weakly linked<br class="">+An optional nopartial<br class=""></blockquote><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">This should really be "``nopartial``" (code-quotes). However, I have</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">a more substantial edit below.</span></div></blockquote><blockquote type="cite" class=""><div class=""><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><blockquote type="cite" style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class="">can be placed after the platform name.<br class="">+With the optional nopartial, when deploying back to a platform version prior to<br class="">+when the declaration was introduced, Clang emits an error specifying that the<br class="">+function is not introduced yet.<br class="">+<br class="">+Without the optional nopartial, a declaration can be used even when deploying back<br class="">+to a platform version prior to when the declaration was introduced.<br class=""></blockquote><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">I'd rather de-emphasize the new flag. We're not expecting much adoption of</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">it (just libc++), so we should keep the text focused on describing the</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">default behaviour. I suggest leaving the wording more like the original:</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">```</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">A declaration can typically be used even when deploying back to a platform</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">version prior to when the declaration was introduced. When this happens,</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">the declaration is -`weakly linked</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">. . .</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">```</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">^ I've just added the word "typically".</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">Later, add a paragraph:</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">```</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">The flag ``flag-name`` disallows using API when deploying back to a</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">platform version prior to when the declaration was introduced. An</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">attempt to use such API before its introduction causes a hard error.</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">Weakly-linking is almost always a better API choice, since it allows</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">users to query availability at runtime.</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">```</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""></div></blockquote><div><br class=""></div>Will update the doc.</div><div><br class=""><blockquote type="cite" class=""><div class=""><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">I'm also not sure about "nopartial" (my fault, this name was my idea).</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">In the context of all the text we have about availability (here, and</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">in the errors and notes) I think "strict" fits much better.</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""></div></blockquote><div><br class=""></div></div><div>I will also change the name to “strict’.</div><div><br class=""></div><div><blockquote type="cite" class=""><div class=""><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><blockquote type="cite" style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class="">When this<br class="">+happens, the declaration is `weakly linked<br class=""><<a href="https://developer.apple.com/library/mac/#documentation/MacOSX/Conceptual/BPFrameworks/Concepts/WeakLinking.html" class="">https://developer.apple.com/library/mac/#documentation/MacOSX/Conceptual/BPFrameworks/Concepts/WeakLinking.html</a>>`_,<br class="">as if the ``weak_import`` attribute were added to the declaration. A<br class="">weakly-linked declaration may or may not be present a run-time, and a program<br class=""><br class="">Modified: cfe/trunk/include/clang/Basic/DiagnosticGroups.td<br class="">URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticGroups.td?rev=261163&r1=261162&r2=261163&view=diff" class="">http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticGroups.td?rev=261163&r1=261162&r2=261163&view=diff</a><br class="">==============================================================================<br class="">--- cfe/trunk/include/clang/Basic/DiagnosticGroups.td (original)<br class="">+++ cfe/trunk/include/clang/Basic/DiagnosticGroups.td Wed Feb 17 16:05:48 2016<br class="">@@ -87,6 +87,7 @@ def DeprecatedAttributes : DiagGroup<"de<br class="">def DeprecatedDeclarations : DiagGroup<"deprecated-declarations">;<br class="">def UnavailableDeclarations : DiagGroup<"unavailable-declarations">;<br class="">def PartialAvailability : DiagGroup<"partial-availability">;<br class="">+def NotYetIntroducedDeclarations : DiagGroup<"not-yet-introduced-declarations">;<br class="">def DeprecatedImplementations :DiagGroup<"deprecated-implementations">;<br class="">def DeprecatedIncrementBool : DiagGroup<"deprecated-increment-bool">;<br class="">def DeprecatedRegister : DiagGroup<"deprecated-register">;<br class=""><br class="">Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td<br class="">URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td?rev=261163&r1=261162&r2=261163&view=diff" class="">http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td?rev=261163&r1=261162&r2=261163&view=diff</a><br class="">==============================================================================<br class="">--- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original)<br class="">+++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Wed Feb 17 16:05:48 2016<br class="">@@ -837,7 +837,7 @@ def warn_accessor_property_type_mismatch<br class="">def not_conv_function_declared_at : Note<"type conversion function declared here">;<br class="">def note_method_declared_at : Note<"method %0 declared here">;<br class="">def note_property_attribute : Note<"property %0 is declared "<br class="">- "%select{deprecated|unavailable|partial}1 here">;<br class="">+ "%select{deprecated|unavailable|partial|not-yet-introduced}1 here">;<br class="">def err_setter_type_void : Error<"type of setter must be void">;<br class="">def err_duplicate_method_decl : Error<"duplicate declaration of method %0">;<br class="">def warn_duplicate_method_decl :<span class="Apple-converted-space"> </span><br class="">@@ -4120,9 +4120,14 @@ def err_unavailable_message : Error<"%0<br class="">def warn_unavailable_fwdclass_message : Warning<<br class=""> "%0 may be unavailable because the receiver type is unknown">,<br class=""> InGroup<UnavailableDeclarations>;<br class="">+def err_notyetintroduced : Error<"%0 is not introduced yet">;<br class="">+def err_notyetintroduced_message : Error<"%0 is not introduced yet: %1">;<br class="">+def warn_notyetintroduced_fwdclass_message : Warning<<br class="">+ "%0 may not be introduced because the receiver type is unknown">,<br class="">+ InGroup<NotYetIntroducedDeclarations>;<br class=""></blockquote><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">There's no testcase for this warning. However, I'm not sure you'll</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">need all these new diagnostics given my other suggestions below.</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><blockquote type="cite" style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class="">def note_availability_specified_here : Note<<br class=""> "%0 has been explicitly marked "<br class="">- "%select{unavailable|deleted|deprecated|partial}1 here">;<br class="">+ "%select{unavailable|deleted|deprecated|partial|not-yet-introduced}1 here">;<br class="">def note_implicitly_deleted : Note<<br class=""> "explicitly defaulted function was implicitly deleted here">;<br class="">def note_inherited_deleted_here : Note<<br class=""><br class="">Modified: cfe/trunk/include/clang/Parse/Parser.h<br class="">URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Parse/Parser.h?rev=261163&r1=261162&r2=261163&view=diff" class="">http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Parse/Parser.h?rev=261163&r1=261162&r2=261163&view=diff</a><br class="">==============================================================================<br class="">--- cfe/trunk/include/clang/Parse/Parser.h (original)<br class="">+++ cfe/trunk/include/clang/Parse/Parser.h Wed Feb 17 16:05:48 2016<br class="">@@ -134,6 +134,9 @@ class Parser : public CodeCompletionHand<br class=""> /// \brief Identifier for "message".<br class=""> IdentifierInfo *Ident_message;<br class=""><br class="">+ /// \brief Identifier for "nopartial".<br class="">+ IdentifierInfo *Ident_nopartial;<br class="">+<br class=""> /// C++0x contextual keywords.<br class=""> mutable IdentifierInfo *Ident_final;<br class=""> mutable IdentifierInfo *Ident_override;<br class=""><br class="">Modified: cfe/trunk/include/clang/Sema/AttributeList.h<br class="">URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Sema/AttributeList.h?rev=261163&r1=261162&r2=261163&view=diff" class="">http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Sema/AttributeList.h?rev=261163&r1=261162&r2=261163&view=diff</a><br class="">==============================================================================<br class="">--- cfe/trunk/include/clang/Sema/AttributeList.h (original)<br class="">+++ cfe/trunk/include/clang/Sema/AttributeList.h Wed Feb 17 16:05:48 2016<br class="">@@ -157,6 +157,17 @@ private:<br class=""> + NumArgs)[index];<br class=""> }<br class=""><br class="">+ /// The location of the 'nopartial' keyword in an availability attribute.<br class="">+ SourceLocation *getNopartialSlot() {<br class="">+ return reinterpret_cast<SourceLocation*>(<br class="">+ &getAvailabilitySlot(ObsoletedSlot) + 1);<br class="">+ }<br class="">+<br class="">+ SourceLocation const *getNopartialSlot() const {<br class="">+ return reinterpret_cast<SourceLocation const*>(<br class="">+ &getAvailabilitySlot(ObsoletedSlot) + 1);<br class="">+ }<br class="">+<br class="">public:<br class=""> struct TypeTagForDatatypeData {<br class=""> ParsedType *MatchingCType;<br class="">@@ -233,7 +244,7 @@ private:<br class=""> const AvailabilityChange &obsoleted,<br class=""> SourceLocation unavailable,<span class="Apple-converted-space"> </span><br class=""> const Expr *messageExpr,<br class="">- Syntax syntaxUsed)<br class="">+ Syntax syntaxUsed, SourceLocation nopartial)<br class=""> : AttrName(attrName), ScopeName(scopeName), AttrRange(attrRange),<br class=""> ScopeLoc(scopeLoc), EllipsisLoc(), NumArgs(1), SyntaxUsed(syntaxUsed),<br class=""> Invalid(false), UsedAsTypeAttr(false), IsAvailability(true),<br class="">@@ -245,6 +256,7 @@ private:<br class=""> new (&getAvailabilitySlot(IntroducedSlot)) AvailabilityChange(introduced);<br class=""> new (&getAvailabilitySlot(DeprecatedSlot)) AvailabilityChange(deprecated);<br class=""> new (&getAvailabilitySlot(ObsoletedSlot)) AvailabilityChange(obsoleted);<br class="">+ memcpy(getNopartialSlot(), &nopartial, sizeof(SourceLocation));<br class=""> AttrKind = getKind(getName(), getScopeName(), syntaxUsed);<br class=""> }<br class=""><br class="">@@ -412,6 +424,11 @@ public:<br class=""> return getAvailabilitySlot(ObsoletedSlot);<br class=""> }<br class=""><br class="">+ SourceLocation getNopartialLoc() const {<br class="">+ assert(getKind() == AT_Availability && "Not an availability attribute");<br class="">+ return *getNopartialSlot();<br class="">+ }<br class="">+<br class=""> SourceLocation getUnavailableLoc() const {<br class=""> assert(getKind() == AT_Availability && "Not an availability attribute");<br class=""> return UnavailableLoc;<br class="">@@ -488,7 +505,7 @@ public:<br class=""> AvailabilityAllocSize =<br class=""> sizeof(AttributeList)<br class=""> + ((3 * sizeof(AvailabilityChange) + sizeof(void*) +<br class="">- sizeof(ArgsUnion) - 1)<br class="">+ sizeof(ArgsUnion) + sizeof(SourceLocation) - 1)<br class=""> / sizeof(void*) * sizeof(void*)),<br class=""> TypeTagForDatatypeAllocSize =<br class=""> sizeof(AttributeList)<br class="">@@ -606,13 +623,14 @@ public:<br class=""> const AvailabilityChange &obsoleted,<br class=""> SourceLocation unavailable,<br class=""> const Expr *MessageExpr,<br class="">- AttributeList::Syntax syntax) {<br class="">+ AttributeList::Syntax syntax,<br class="">+ SourceLocation nopartial) {<br class=""> void *memory = allocate(AttributeFactory::AvailabilityAllocSize);<br class=""> return add(new (memory) AttributeList(attrName, attrRange,<br class=""> scopeName, scopeLoc,<br class=""> Param, introduced, deprecated,<br class=""> obsoleted, unavailable, MessageExpr,<br class="">- syntax));<br class="">+ syntax, nopartial));<br class=""> }<br class=""><br class=""> AttributeList *create(IdentifierInfo *attrName, SourceRange attrRange,<br class="">@@ -741,10 +759,12 @@ public:<br class=""> const AvailabilityChange &obsoleted,<br class=""> SourceLocation unavailable,<br class=""> const Expr *MessageExpr,<br class="">- AttributeList::Syntax syntax) {<br class="">+ AttributeList::Syntax syntax,<br class="">+ SourceLocation nopartial) {<br class=""> AttributeList *attr =<br class=""> pool.create(attrName, attrRange, scopeName, scopeLoc, Param, introduced,<br class="">- deprecated, obsoleted, unavailable, MessageExpr, syntax);<br class="">+ deprecated, obsoleted, unavailable, MessageExpr, syntax,<br class="">+ nopartial);<br class=""> add(attr);<br class=""> return attr;<br class=""> }<br class=""><br class="">Modified: cfe/trunk/include/clang/Sema/DelayedDiagnostic.h<br class="">URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Sema/DelayedDiagnostic.h?rev=261163&r1=261162&r2=261163&view=diff" class="">http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Sema/DelayedDiagnostic.h?rev=261163&r1=261162&r2=261163&view=diff</a><br class="">==============================================================================<br class="">--- cfe/trunk/include/clang/Sema/DelayedDiagnostic.h (original)<br class="">+++ cfe/trunk/include/clang/Sema/DelayedDiagnostic.h Wed Feb 17 16:05:48 2016<br class="">@@ -113,7 +113,8 @@ private:<br class="">/// the complete parsing of the current declaration.<br class="">class DelayedDiagnostic {<br class="">public:<br class="">- enum DDKind { Deprecation, Unavailable, Access, ForbiddenType };<br class="">+ enum DDKind { Deprecation, Unavailable, Access, ForbiddenType,<br class="">+ NotYetIntroduced };<br class=""></blockquote><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">Why do we need "NotYetIntroduced"? We don't need a new DDKind</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">for obsoleted API, so I don't think we need one here... and I</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">think that will simplify the change quite a bit.</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""></div></blockquote><div><br class=""></div>I agree that Obsolete, Unavailable and strictly not-introduced can share the same Diagnostic kind.</div><div><br class=""></div><div>Thanks for reviewing!</div><div>Manman</div><div><br class=""><blockquote type="cite" class=""><div class=""><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">This has an effect on the error and note text, but I actually</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">think it's a good effect.</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><blockquote type="cite" style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""> unsigned char Kind; // actually a DDKind<br class=""> bool Triggered;<br class="">@@ -165,13 +166,15 @@ public:<br class=""> }<br class=""><br class=""> const NamedDecl *getDeprecationDecl() const {<br class="">- assert((Kind == Deprecation || Kind == Unavailable) &&<br class="">+ assert((Kind == Deprecation || Kind == Unavailable ||<br class="">+ Kind == NotYetIntroduced) &&<br class=""> "Not a deprecation diagnostic.");<br class=""> return DeprecationData.Decl;<br class=""> }<br class=""><br class=""> StringRef getDeprecationMessage() const {<br class="">- assert((Kind == Deprecation || Kind == Unavailable) &&<br class="">+ assert((Kind == Deprecation || Kind == Unavailable ||<br class="">+ Kind == NotYetIntroduced) &&<br class=""> "Not a deprecation diagnostic.");<br class=""> return StringRef(DeprecationData.Message,<br class=""> DeprecationData.MessageLen);<br class=""><br class="">Modified: cfe/trunk/include/clang/Sema/Sema.h<br class="">URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Sema/Sema.h?rev=261163&r1=261162&r2=261163&view=diff" class="">http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Sema/Sema.h?rev=261163&r1=261162&r2=261163&view=diff</a><br class="">==============================================================================<br class="">--- cfe/trunk/include/clang/Sema/Sema.h (original)<br class="">+++ cfe/trunk/include/clang/Sema/Sema.h Wed Feb 17 16:05:48 2016<br class="">@@ -2108,6 +2108,7 @@ public:<br class=""> VersionTuple Obsoleted,<br class=""> bool IsUnavailable,<br class=""> StringRef Message,<br class="">+ bool IsNopartial,<br class=""> AvailabilityMergeKind AMK,<br class=""> unsigned AttrSpellingListIndex);<br class=""> TypeVisibilityAttr *mergeTypeVisibilityAttr(Decl *D, SourceRange Range,<br class="">@@ -3535,7 +3536,8 @@ public:<br class=""><br class=""> void redelayDiagnostics(sema::DelayedDiagnosticPool &pool);<br class=""><br class="">- enum AvailabilityDiagnostic { AD_Deprecation, AD_Unavailable, AD_Partial };<br class="">+ enum AvailabilityDiagnostic { AD_Deprecation, AD_Unavailable, AD_Partial,<br class="">+ AD_NotYetIntroduced };<br class=""><br class=""> void EmitAvailabilityWarning(AvailabilityDiagnostic AD,<br class=""> NamedDecl *D, StringRef Message,<br class=""><br class="">Modified: cfe/trunk/lib/Parse/ParseDecl.cpp<br class="">URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/ParseDecl.cpp?rev=261163&r1=261162&r2=261163&view=diff" class="">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/ParseDecl.cpp?rev=261163&r1=261162&r2=261163&view=diff</a><br class="">==============================================================================<br class="">--- cfe/trunk/lib/Parse/ParseDecl.cpp (original)<br class="">+++ cfe/trunk/lib/Parse/ParseDecl.cpp Wed Feb 17 16:05:48 2016<br class="">@@ -833,11 +833,14 @@ VersionTuple Parser::ParseVersionTuple(S<br class="">/// \brief Parse the contents of the "availability" attribute.<br class="">///<br class="">/// availability-attribute:<br class="">-/// 'availability' '(' platform ',' version-arg-list, opt-message')'<br class="">+/// 'availability' '(' platform ',' opt-nopartial version-arg-list, opt-message')'<br class="">///<br class="">/// platform:<br class="">/// identifier<br class="">///<br class="">+/// opt-nopartial:<br class="">+/// 'nopartial' ','<br class="">+///<br class="">/// version-arg-list:<br class="">/// version-arg<br class="">/// version-arg ',' version-arg-list<br class="">@@ -867,7 +870,7 @@ void Parser::ParseAvailabilityAttribute(<br class=""> return;<br class=""> }<br class=""><br class="">- // Parse the platform name,<br class="">+ // Parse the platform name.<br class=""> if (Tok.isNot(tok::identifier)) {<br class=""> Diag(Tok, diag::err_availability_expected_platform);<br class=""> SkipUntil(tok::r_paren, StopAtSemi);<br class="">@@ -889,10 +892,12 @@ void Parser::ParseAvailabilityAttribute(<br class=""> Ident_obsoleted = PP.getIdentifierInfo("obsoleted");<br class=""> Ident_unavailable = PP.getIdentifierInfo("unavailable");<br class=""> Ident_message = PP.getIdentifierInfo("message");<br class="">+ Ident_nopartial = PP.getIdentifierInfo("nopartial");<br class=""> }<br class=""><br class="">- // Parse the set of introductions/deprecations/removals.<br class="">- SourceLocation UnavailableLoc;<br class="">+ // Parse the optional "nopartial" and the set of<br class="">+ // introductions/deprecations/removals.<br class="">+ SourceLocation UnavailableLoc, NopartialLoc;<br class=""> do {<br class=""> if (Tok.isNot(tok::identifier)) {<br class=""> Diag(Tok, diag::err_availability_expected_change);<br class="">@@ -902,6 +907,15 @@ void Parser::ParseAvailabilityAttribute(<br class=""> IdentifierInfo *Keyword = Tok.getIdentifierInfo();<br class=""> SourceLocation KeywordLoc = ConsumeToken();<br class=""><br class="">+ if (Keyword == Ident_nopartial) {<br class="">+ if (NopartialLoc.isValid()) {<br class="">+ Diag(KeywordLoc, diag::err_availability_redundant)<br class="">+ << Keyword << SourceRange(NopartialLoc);<br class="">+ }<br class="">+ NopartialLoc = KeywordLoc;<br class="">+ continue;<br class="">+ }<br class="">+<br class=""> if (Keyword == Ident_unavailable) {<br class=""> if (UnavailableLoc.isValid()) {<br class=""> Diag(KeywordLoc, diag::err_availability_redundant)<br class="">@@ -1023,7 +1037,7 @@ void Parser::ParseAvailabilityAttribute(<br class=""> Changes[Deprecated],<br class=""> Changes[Obsoleted],<br class=""> UnavailableLoc, MessageExpr.get(),<br class="">- Syntax);<br class="">+ Syntax, NopartialLoc);<br class="">}<br class=""><br class="">/// \brief Parse the contents of the "objc_bridge_related" attribute.<br class=""><br class="">Modified: cfe/trunk/lib/Parse/Parser.cpp<br class="">URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/Parser.cpp?rev=261163&r1=261162&r2=261163&view=diff" class="">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/Parser.cpp?rev=261163&r1=261162&r2=261163&view=diff</a><br class="">==============================================================================<br class="">--- cfe/trunk/lib/Parse/Parser.cpp (original)<br class="">+++ cfe/trunk/lib/Parse/Parser.cpp Wed Feb 17 16:05:48 2016<br class="">@@ -491,6 +491,7 @@ void Parser::Initialize() {<br class=""> Ident_deprecated = nullptr;<br class=""> Ident_obsoleted = nullptr;<br class=""> Ident_unavailable = nullptr;<br class="">+ Ident_nopartial = nullptr;<br class=""><br class=""> Ident__except = nullptr;<br class=""><br class=""><br class="">Modified: cfe/trunk/lib/Sema/DelayedDiagnostic.cpp<br class="">URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/DelayedDiagnostic.cpp?rev=261163&r1=261162&r2=261163&view=diff" class="">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/DelayedDiagnostic.cpp?rev=261163&r1=261162&r2=261163&view=diff</a><br class="">==============================================================================<br class="">--- cfe/trunk/lib/Sema/DelayedDiagnostic.cpp (original)<br class="">+++ cfe/trunk/lib/Sema/DelayedDiagnostic.cpp Wed Feb 17 16:05:48 2016<br class="">@@ -35,6 +35,9 @@ DelayedDiagnostic::makeAvailability(Sema<br class=""> case Sema::AD_Unavailable:<br class=""> DD.Kind = Unavailable;<br class=""> break;<br class="">+ case Sema::AD_NotYetIntroduced:<br class="">+ DD.Kind = NotYetIntroduced;<br class="">+ break;<br class=""> case Sema::AD_Partial:<br class=""> llvm_unreachable("AD_Partial diags should not be delayed");<br class=""> }<br class="">@@ -63,6 +66,7 @@ void DelayedDiagnostic::Destroy() {<br class=""><br class=""> case Deprecation:<br class=""> case Unavailable:<br class="">+ case NotYetIntroduced:<br class=""> delete [] DeprecationData.Message;<br class=""> break;<br class=""><br class=""><br class="">Modified: cfe/trunk/lib/Sema/SemaDecl.cpp<br class="">URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDecl.cpp?rev=261163&r1=261162&r2=261163&view=diff" class="">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDecl.cpp?rev=261163&r1=261162&r2=261163&view=diff</a><br class="">==============================================================================<br class="">--- cfe/trunk/lib/Sema/SemaDecl.cpp (original)<br class="">+++ cfe/trunk/lib/Sema/SemaDecl.cpp Wed Feb 17 16:05:48 2016<br class="">@@ -2196,7 +2196,7 @@ static bool mergeDeclAttribute(Sema &S,<br class=""> NewAttr = S.mergeAvailabilityAttr(D, AA->getRange(), AA->getPlatform(),<br class=""> AA->getIntroduced(), AA->getDeprecated(),<br class=""> AA->getObsoleted(), AA->getUnavailable(),<br class="">- AA->getMessage(), AMK,<br class="">+ AA->getMessage(), AA->getNopartial(), AMK,<br class=""> AttrSpellingListIndex);<br class=""> else if (const auto *VA = dyn_cast<VisibilityAttr>(Attr))<br class=""> NewAttr = S.mergeVisibilityAttr(D, VA->getRange(), VA->getVisibility(),<br class=""><br class="">Modified: cfe/trunk/lib/Sema/SemaDeclAttr.cpp<br class="">URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclAttr.cpp?rev=261163&r1=261162&r2=261163&view=diff" class="">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclAttr.cpp?rev=261163&r1=261162&r2=261163&view=diff</a><br class="">==============================================================================<br class="">--- cfe/trunk/lib/Sema/SemaDeclAttr.cpp (original)<br class="">+++ cfe/trunk/lib/Sema/SemaDeclAttr.cpp Wed Feb 17 16:05:48 2016<br class="">@@ -1916,6 +1916,7 @@ AvailabilityAttr *Sema::mergeAvailabilit<br class=""> VersionTuple Obsoleted,<br class=""> bool IsUnavailable,<br class=""> StringRef Message,<br class="">+ bool IsNopartial,<br class=""> AvailabilityMergeKind AMK,<br class=""> unsigned AttrSpellingListIndex) {<br class=""> VersionTuple MergedIntroduced = Introduced;<br class="">@@ -2062,7 +2063,7 @@ AvailabilityAttr *Sema::mergeAvailabilit<br class=""> return ::new (Context) AvailabilityAttr(Range, Context, Platform,<br class=""> Introduced, Deprecated,<br class=""> Obsoleted, IsUnavailable, Message,<br class="">- AttrSpellingListIndex);<br class="">+ IsNopartial, AttrSpellingListIndex);<br class=""> }<br class=""> return nullptr;<br class="">}<br class="">@@ -2089,6 +2090,7 @@ static void handleAvailabilityAttr(Sema<br class=""> AvailabilityChange Deprecated = Attr.getAvailabilityDeprecated();<br class=""> AvailabilityChange Obsoleted = Attr.getAvailabilityObsoleted();<br class=""> bool IsUnavailable = Attr.getUnavailableLoc().isValid();<br class="">+ bool IsNopartial = Attr.getNopartialLoc().isValid();<br class=""> StringRef Str;<br class=""> if (const StringLiteral *SE =<br class=""> dyn_cast_or_null<StringLiteral>(Attr.getMessageExpr()))<br class="">@@ -2099,6 +2101,7 @@ static void handleAvailabilityAttr(Sema<br class=""> Deprecated.Version,<br class=""> Obsoleted.Version,<br class=""> IsUnavailable, Str,<br class="">+ IsNopartial,<br class=""> Sema::AMK_None,<br class=""> Index);<br class=""> if (NewAttr)<br class="">@@ -2143,6 +2146,7 @@ static void handleAvailabilityAttr(Sema<br class=""> NewDeprecated,<br class=""> NewObsoleted,<br class=""> IsUnavailable, Str,<br class="">+ IsNopartial,<br class=""> Sema::AMK_None,<br class=""> Index);<br class=""> if (NewAttr)<br class="">@@ -2165,6 +2169,7 @@ static void handleAvailabilityAttr(Sema<br class=""> Deprecated.Version,<br class=""> Obsoleted.Version,<br class=""> IsUnavailable, Str,<br class="">+ IsNopartial,<br class=""> Sema::AMK_None,<br class=""> Index);<br class=""> if (NewAttr)<br class="">@@ -5957,6 +5962,14 @@ static void DoEmitAvailabilityWarning(Se<br class=""> property_note_select = /* partial */ 2;<br class=""> available_here_select_kind = /* partial */ 3;<br class=""> break;<br class="">+<br class="">+ case Sema::AD_NotYetIntroduced:<br class="">+ diag = diag::err_notyetintroduced;<br class="">+ diag_message = diag::err_notyetintroduced_message;<br class="">+ diag_fwdclass_message = diag::warn_notyetintroduced_fwdclass_message;<br class="">+ property_note_select = /* deprecated */ 3;<br class="">+ available_here_select_kind = /* notyetintroduced */ 4;<br class="">+ break;<br class=""> }<br class=""><br class=""> if (!Message.empty()) {<br class="">@@ -5983,10 +5996,22 @@ static void DoEmitAvailabilityWarning(Se<br class="">static void handleDelayedAvailabilityCheck(Sema &S, DelayedDiagnostic &DD,<br class=""> Decl *Ctx) {<br class=""> assert(DD.Kind == DelayedDiagnostic::Deprecation ||<br class="">- DD.Kind == DelayedDiagnostic::Unavailable);<br class="">- Sema::AvailabilityDiagnostic AD = DD.Kind == DelayedDiagnostic::Deprecation<br class="">- ? Sema::AD_Deprecation<br class="">- : Sema::AD_Unavailable;<br class="">+ DD.Kind == DelayedDiagnostic::Unavailable ||<br class="">+ DD.Kind == DelayedDiagnostic::NotYetIntroduced);<br class="">+ Sema::AvailabilityDiagnostic AD;<br class="">+ switch (DD.Kind) {<br class="">+ case DelayedDiagnostic::Deprecation:<br class="">+ AD = Sema::AD_Deprecation;<br class="">+ break;<br class="">+ case DelayedDiagnostic::Unavailable:<br class="">+ AD = Sema::AD_Unavailable;<br class="">+ break;<br class="">+ case DelayedDiagnostic::NotYetIntroduced:<br class="">+ AD = Sema::AD_NotYetIntroduced;<br class="">+ break;<br class="">+ default:<br class="">+ llvm_unreachable("Expecting: deprecated, unavailable, not-yet-introduced");<br class="">+ }<br class=""> DD.Triggered = true;<br class=""> DoEmitAvailabilityWarning(<br class=""> S, AD, Ctx, DD.getDeprecationDecl(), DD.getDeprecationMessage(), DD.Loc,<br class=""><br class="">Modified: cfe/trunk/lib/Sema/SemaExpr.cpp<br class="">URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExpr.cpp?rev=261163&r1=261162&r2=261163&view=diff" class="">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExpr.cpp?rev=261163&r1=261162&r2=261163&view=diff</a><br class="">==============================================================================<br class="">--- cfe/trunk/lib/Sema/SemaExpr.cpp (original)<br class="">+++ cfe/trunk/lib/Sema/SemaExpr.cpp Wed Feb 17 16:05:48 2016<br class="">@@ -137,7 +137,7 @@ DiagnoseAvailabilityOfDecl(Sema &S, Name<br class=""><br class=""> const ObjCPropertyDecl *ObjCPDecl = nullptr;<br class=""> if (Result == AR_Deprecated || Result == AR_Unavailable ||<br class="">- AR_NotYetIntroduced) {<br class="">+ Result == AR_NotYetIntroduced) {<br class=""> if (const ObjCMethodDecl *MD = dyn_cast<ObjCMethodDecl>(D)) {<br class=""> if (const ObjCPropertyDecl *PD = MD->findPropertyDecl()) {<br class=""> AvailabilityResult PDeclResult = PD->getAvailability(nullptr);<br class="">@@ -159,11 +159,20 @@ DiagnoseAvailabilityOfDecl(Sema &S, Name<br class=""> break;<br class=""><br class=""> case AR_NotYetIntroduced: {<br class="">+ // With nopartial, the compiler will emit delayed error just like how<br class="">+ // "deprecated, unavailable" are handled.<br class="">+ AvailabilityAttr *AA = D->getAttr<AvailabilityAttr>();<br class="">+ if (AA && AA->getNopartial() &&<br class="">+ S.getCurContextAvailability() != AR_NotYetIntroduced)<br class="">+ S.EmitAvailabilityWarning(Sema::AD_NotYetIntroduced,<br class="">+ D, Message, Loc, UnknownObjCClass, ObjCPDecl,<br class="">+ ObjCPropertyAccess);<br class="">+<br class=""> // Don't do this for enums, they can't be redeclared.<br class=""> if (isa<EnumConstantDecl>(D) || isa<EnumDecl>(D))<br class=""> break;<br class=""><br class="">- bool Warn = !D->getAttr<AvailabilityAttr>()->isInherited();<br class="">+ bool Warn = !AA->isInherited();<br class=""> // Objective-C method declarations in categories are not modelled as<br class=""> // redeclarations, so manually look for a redeclaration in a category<br class=""> // if necessary.<br class=""><br class="">Modified: cfe/trunk/test/Sema/attr-availability-macosx.c<br class="">URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/attr-availability-macosx.c?rev=261163&r1=261162&r2=261163&view=diff" class="">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/attr-availability-macosx.c?rev=261163&r1=261162&r2=261163&view=diff</a><br class="">==============================================================================<br class="">--- cfe/trunk/test/Sema/attr-availability-macosx.c (original)<br class="">+++ cfe/trunk/test/Sema/attr-availability-macosx.c Wed Feb 17 16:05:48 2016<br class="">@@ -6,6 +6,7 @@ void f2(int) __attribute__((availability<br class="">void f3(int) __attribute__((availability(macosx,introduced=10.6)));<br class="">void f4(int) __attribute__((availability(macosx,introduced=10.1,deprecated=10.3,obsoleted=10.5), availability(ios,introduced=2.0,deprecated=3.0))); // expected-note{{explicitly marked unavailable}}<br class="">void f5(int) __attribute__((availability(ios,introduced=3.2), availability(macosx,unavailable))); // expected-note{{'f5' has been explicitly marked unavailable here}}<br class="">+void f6(int) __attribute__((availability(macosx,nopartial,introduced=10.6))); //expected-note{{'f6' has been explicitly marked not-yet-introduced here}}<br class=""></blockquote><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">In the context of this note, I think "nopartial" isn't self-explanatory</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">with the error/note text (sadly I came up with it). I think "strict"</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">is better.</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">Also, for consistency with obsoleted API, I think this should be</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">"marked unavailable here" ("marked not-yet-introduced here" is awkward).</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><blockquote type="cite" style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class="">void test() {<br class=""> f0(0);<br class="">@@ -14,6 +15,7 @@ void test() {<br class=""> f3(0);<br class=""> f4(0); // expected-error{{f4' is unavailable: obsoleted in OS X 10.5}}<br class=""> f5(0); // expected-error{{'f5' is unavailable: not available on OS X}}<br class="">+ f6(0); // expected-error{{'f6' is not introduced yet: introduced in OS X 10.6}}<br class=""></blockquote><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">This error makes more sense to me:</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">```</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">expected-error{{'f6' is unavailable: not introduced until OS X 10.6}</span></div></blockquote></div><div><blockquote type="cite" class=""><div class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">```</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">In combination with the note, we get something like:</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">```</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">...: error: 'f6' is unavailable: not introduced until OS X 10.6</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class=""> f6(0);</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class=""> ^</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">...: note: 'f6' has been explicitly marked unavailable here</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class=""> void f6(int) __attribute__((availability(macosx,strict,introduced=10.6)));</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class=""> ^</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">```</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">This is more consistent with the other reasons API might be</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">unavailable, and I think the language is more clear.</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><blockquote type="cite" style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class="">}<br class=""><br class="">//<span class="Apple-converted-space"> </span><a href="rdar://10535640" class="">rdar://10535640</a><br class=""><br class=""><br class="">_______________________________________________<br class="">cfe-commits mailing list<br class=""><a href="mailto:cfe-commits@lists.llvm.org" class="">cfe-commits@lists.llvm.org</a><br class=""><a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits" class="">http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits</a><br class=""></blockquote><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">_______________________________________________</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">cfe-commits mailing list</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><a href="mailto:cfe-commits@lists.llvm.org" style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class="">cfe-commits@lists.llvm.org</a><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits" style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class="">http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits</a></div></blockquote></div><br class=""></body></html>