<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>