[cfe-commits] r146304 - in /cfe/trunk: include/clang/Basic/Attr.td include/clang/Parse/Parser.h include/clang/Sema/AttributeList.h lib/AST/DeclBase.cpp lib/Parse/ParseDecl.cpp lib/Sema/SemaDeclAttr.cpp test/Parser/attr-availability.c test/Sema/attr-availability.c

Douglas Gregor dgregor at apple.com
Fri Dec 9 17:37:48 PST 2011


FWIW, this seems to be failing on one of chapuni's buildbots:

	http://bb.pgr.jp/builders/cmake-clang-i686-msvc10/builds/4937

	- Doug

On Dec 9, 2011, at 4:28 PM, Fariborz Jahanian wrote:

> Author: fjahanian
> Date: Fri Dec  9 18:28:41 2011
> New Revision: 146304
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=146304&view=rev
> Log:
> Add ability to supply additional message to availability macros,
> // rdar://10095131
> 
> Modified:
>    cfe/trunk/include/clang/Basic/Attr.td
>    cfe/trunk/include/clang/Parse/Parser.h
>    cfe/trunk/include/clang/Sema/AttributeList.h
>    cfe/trunk/lib/AST/DeclBase.cpp
>    cfe/trunk/lib/Parse/ParseDecl.cpp
>    cfe/trunk/lib/Sema/SemaDeclAttr.cpp
>    cfe/trunk/test/Parser/attr-availability.c
>    cfe/trunk/test/Sema/attr-availability.c
> 
> Modified: cfe/trunk/include/clang/Basic/Attr.td
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/Attr.td?rev=146304&r1=146303&r2=146304&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Basic/Attr.td (original)
> +++ cfe/trunk/include/clang/Basic/Attr.td Fri Dec  9 18:28:41 2011
> @@ -146,7 +146,7 @@
>   let Spellings = ["availability"];
>   let Args = [IdentifierArgument<"platform">, VersionArgument<"introduced">,
>               VersionArgument<"deprecated">, VersionArgument<"obsoleted">,
> -              BoolArgument<"unavailable">];
> +              BoolArgument<"unavailable">, StringArgument<"message">];
>   let AdditionalMembers =
> [{static llvm::StringRef getPrettyPlatformName(llvm::StringRef Platform) {
>     return llvm::StringSwitch<llvm::StringRef>(Platform)
> 
> Modified: cfe/trunk/include/clang/Parse/Parser.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Parse/Parser.h?rev=146304&r1=146303&r2=146304&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Parse/Parser.h (original)
> +++ cfe/trunk/include/clang/Parse/Parser.h Fri Dec  9 18:28:41 2011
> @@ -147,6 +147,9 @@
> 
>   /// \brief Identifier for "unavailable".
>   IdentifierInfo *Ident_unavailable;
> +  
> +  /// \brief Identifier for "message".
> +  IdentifierInfo *Ident_message;
> 
>   /// C++0x contextual keywords.
>   mutable IdentifierInfo *Ident_final;
> 
> Modified: cfe/trunk/include/clang/Sema/AttributeList.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Sema/AttributeList.h?rev=146304&r1=146303&r2=146304&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Sema/AttributeList.h (original)
> +++ cfe/trunk/include/clang/Sema/AttributeList.h Fri Dec  9 18:28:41 2011
> @@ -85,6 +85,8 @@
>   /// \brief The location of the 'unavailable' keyword in an
>   /// availability attribute.
>   SourceLocation UnavailableLoc;
> +  
> +  const Expr *MessageExpr;
> 
>   /// The next attribute in the current position.
>   AttributeList *NextInPosition;
> @@ -138,13 +140,15 @@
>                 const AvailabilityChange &introduced,
>                 const AvailabilityChange &deprecated,
>                 const AvailabilityChange &obsoleted,
> -                SourceLocation unavailable,
> +                SourceLocation unavailable, 
> +                const Expr *messageExpr,
>                 bool declspec, bool cxx0x)
>     : AttrName(attrName), ScopeName(scopeName), ParmName(parmName),
>       AttrRange(attrRange), ScopeLoc(scopeLoc), ParmLoc(parmLoc),
>       NumArgs(0), DeclspecAttribute(declspec), CXX0XAttribute(cxx0x),
>       Invalid(false), UsedAsTypeAttr(false), IsAvailability(true),
> -      UnavailableLoc(unavailable), NextInPosition(0), NextInPool(0) {
> +      UnavailableLoc(unavailable), MessageExpr(messageExpr),
> +      NextInPosition(0), NextInPool(0) {
>     new (&getAvailabilitySlot(IntroducedSlot)) AvailabilityChange(introduced);
>     new (&getAvailabilitySlot(DeprecatedSlot)) AvailabilityChange(deprecated);
>     new (&getAvailabilitySlot(ObsoletedSlot)) AvailabilityChange(obsoleted);
> @@ -371,6 +375,11 @@
>     assert(getKind() == AT_availability && "Not an availability attribute");
>     return UnavailableLoc;
>   }
> +  
> +  const Expr * getMessageExpr() const {
> +    assert(getKind() == AT_availability && "Not an availability attribute");
> +    return MessageExpr;
> +  }
> };
> 
> /// A factory, from which one makes pools, from which one creates
> @@ -492,13 +501,14 @@
>                         const AvailabilityChange &deprecated,
>                         const AvailabilityChange &obsoleted,
>                         SourceLocation unavailable,
> +                        const Expr *MessageExpr,
>                         bool declspec = false, bool cxx0x = false) {
>     void *memory = allocate(AttributeFactory::AvailabilityAllocSize);
>     return add(new (memory) AttributeList(attrName, attrRange,
>                                           scopeName, scopeLoc,
>                                           parmName, parmLoc,
>                                           introduced, deprecated, obsoleted,
> -                                          unavailable,
> +                                          unavailable, MessageExpr,
>                                           declspec, cxx0x));
>   }
> 
> @@ -616,10 +626,12 @@
>                         const AvailabilityChange &deprecated,
>                         const AvailabilityChange &obsoleted,
>                         SourceLocation unavailable,
> +                        const Expr *MessageExpr,
>                         bool declspec = false, bool cxx0x = false) {
>     AttributeList *attr =
>       pool.create(attrName, attrRange, scopeName, scopeLoc, parmName, parmLoc,
>                   introduced, deprecated, obsoleted, unavailable,
> +                  MessageExpr,
>                   declspec, cxx0x);
>     add(attr);
>     return attr;
> 
> Modified: cfe/trunk/lib/AST/DeclBase.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/DeclBase.cpp?rev=146304&r1=146303&r2=146304&view=diff
> ==============================================================================
> --- cfe/trunk/lib/AST/DeclBase.cpp (original)
> +++ cfe/trunk/lib/AST/DeclBase.cpp Fri Dec  9 18:28:41 2011
> @@ -282,13 +282,20 @@
>   // Match the platform name.
>   if (A->getPlatform()->getName() != TargetPlatform)
>     return AR_Available;
> -
> +  
> +  std::string HintMessage;
> +  if (!A->getMessage().empty()) {
> +    HintMessage = " - ";
> +    HintMessage += A->getMessage();
> +  }
> +  
>   // Make sure that this declaration has not been marked 'unavailable'.
>   if (A->getUnavailable()) {
>     if (Message) {
>       Message->clear();
>       llvm::raw_string_ostream Out(*Message);
> -      Out << "not available on " << PrettyPlatformName;
> +      Out << "not available on " << PrettyPlatformName 
> +          << HintMessage;
>     }
> 
>     return AR_Unavailable;
> @@ -301,7 +308,7 @@
>       Message->clear();
>       llvm::raw_string_ostream Out(*Message);
>       Out << "introduced in " << PrettyPlatformName << ' ' 
> -          << A->getIntroduced();
> +          << A->getIntroduced() << HintMessage;
>     }
> 
>     return AR_NotYetIntroduced;
> @@ -313,7 +320,7 @@
>       Message->clear();
>       llvm::raw_string_ostream Out(*Message);
>       Out << "obsoleted in " << PrettyPlatformName << ' ' 
> -          << A->getObsoleted();
> +          << A->getObsoleted() << HintMessage;
>     }
> 
>     return AR_Unavailable;
> @@ -325,7 +332,7 @@
>       Message->clear();
>       llvm::raw_string_ostream Out(*Message);
>       Out << "first deprecated in " << PrettyPlatformName << ' '
> -          << A->getDeprecated();
> +          << A->getDeprecated() << HintMessage;
>     }
> 
>     return AR_Deprecated;
> 
> Modified: cfe/trunk/lib/Parse/ParseDecl.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/ParseDecl.cpp?rev=146304&r1=146303&r2=146304&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Parse/ParseDecl.cpp (original)
> +++ cfe/trunk/lib/Parse/ParseDecl.cpp Fri Dec  9 18:28:41 2011
> @@ -522,7 +522,7 @@
> /// \brief Parse the contents of the "availability" attribute.
> ///
> /// availability-attribute:
> -///   'availability' '(' platform ',' version-arg-list ')'
> +///   'availability' '(' platform ',' version-arg-list, opt-message')'
> ///
> /// platform:
> ///   identifier
> @@ -536,6 +536,8 @@
> ///   'deprecated' '=' version
> ///   'removed' = version
> ///   'unavailable'
> +/// opt-message:
> +///   'message' '=' <string>
> void Parser::ParseAvailabilityAttribute(IdentifierInfo &Availability,
>                                         SourceLocation AvailabilityLoc,
>                                         ParsedAttributes &attrs,
> @@ -545,6 +547,7 @@
> 
>   enum { Introduced, Deprecated, Obsoleted, Unknown };
>   AvailabilityChange Changes[Unknown];
> +  ExprResult MessageExpr;
> 
>   // Opening '('.
>   BalancedDelimiterTracker T(*this, tok::l_paren);
> @@ -573,6 +576,7 @@
>     Ident_deprecated = PP.getIdentifierInfo("deprecated");
>     Ident_obsoleted = PP.getIdentifierInfo("obsoleted");
>     Ident_unavailable = PP.getIdentifierInfo("unavailable");
> +    Ident_message = PP.getIdentifierInfo("message");
>   }
> 
>   // Parse the set of introductions/deprecations/removals.
> @@ -599,7 +603,7 @@
>       ConsumeToken();
>       continue;
>     } 
> -
> +    
>     if (Tok.isNot(tok::equal)) {
>       Diag(Tok, diag::err_expected_equal_after)
>         << Keyword;
> @@ -607,6 +611,15 @@
>       return;
>     }
>     ConsumeToken();
> +    if (Keyword == Ident_message) {
> +      if (!isTokenStringLiteral()) {
> +        Diag(Tok, diag::err_expected_string_literal);
> +        SkipUntil(tok::r_paren);
> +        return;
> +      }
> +      MessageExpr = ParseStringLiteralExpression();
> +      break;
> +    }
> 
>     SourceRange VersionRange;
>     VersionTuple Version = ParseVersionTuple(VersionRange);
> @@ -682,7 +695,8 @@
>                Changes[Introduced],
>                Changes[Deprecated],
>                Changes[Obsoleted], 
> -               UnavailableLoc, false, false);
> +               UnavailableLoc, MessageExpr.take(),
> +               false, false);
> }
> 
> 
> 
> Modified: cfe/trunk/lib/Sema/SemaDeclAttr.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclAttr.cpp?rev=146304&r1=146303&r2=146304&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaDeclAttr.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaDeclAttr.cpp Fri Dec  9 18:28:41 2011
> @@ -1624,12 +1624,19 @@
>     return;
>   }
> 
> +  StringRef Str;
> +  const StringLiteral *SE = 
> +    dyn_cast_or_null<const StringLiteral>(Attr.getMessageExpr());
> +  if (SE)
> +    Str = SE->getString();
> +  
>   D->addAttr(::new (S.Context) AvailabilityAttr(Attr.getRange(), S.Context,
>                                                 Platform,
>                                                 Introduced.Version,
>                                                 Deprecated.Version,
>                                                 Obsoleted.Version,
> -                                                IsUnavailable));
> +                                                IsUnavailable, 
> +                                                Str));
> }
> 
> static void handleVisibilityAttr(Sema &S, Decl *D, const AttributeList &Attr) {
> 
> Modified: cfe/trunk/test/Parser/attr-availability.c
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Parser/attr-availability.c?rev=146304&r1=146303&r2=146304&view=diff
> ==============================================================================
> --- cfe/trunk/test/Parser/attr-availability.c (original)
> +++ cfe/trunk/test/Parser/attr-availability.c Fri Dec  9 18:28:41 2011
> @@ -18,3 +18,11 @@
> 
> void f6() __attribute__((availability(macosx,unavailable,introduced=10.5))); // expected-warning{{warning: 'unavailable' availability overrides all other availability information}}
> 
> +// rdar://10095131
> +enum E{
> +    gorf __attribute__((availability(macosx,introduced=8.5, message = 10.0))), // expected-error {{expected string literal}}
> +    garf __attribute__((availability(macosx,introduced=8.5, message))), // expected-error {{expected '=' after 'message'}}
> +
> +    foo __attribute__((availability(macosx,introduced=8.5,deprecated=9.0, message="Use CTFontCopyPostScriptName()", deprecated=10.0))) // expected-error {{expected ')'}} \
> +                                                                                                                                       // expected-note {{to match this '('}}
> +};
> 
> Modified: cfe/trunk/test/Sema/attr-availability.c
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/attr-availability.c?rev=146304&r1=146303&r2=146304&view=diff
> ==============================================================================
> --- cfe/trunk/test/Sema/attr-availability.c (original)
> +++ cfe/trunk/test/Sema/attr-availability.c Fri Dec  9 18:28:41 2011
> @@ -5,3 +5,15 @@
> void f2() __attribute__((availability(ios,introduced=2.1,deprecated=2.1)));
> 
> void f3() __attribute__((availability(otheros,introduced=2.2))); // expected-warning{{unknown platform 'otheros' in availability macro}}
> +
> +// rdar://10095131
> +extern void 
> +ATSFontGetName(const char *oName) __attribute__((availability(macosx,introduced=8.0,deprecated=9.0, message="use CTFontCopyFullName")));
> +
> +extern void
> +ATSFontGetPostScriptName(int flags) __attribute__((availability(macosx,introduced=8.0,obsoleted=9.0, message="use ATSFontGetFullPostScriptName"))); // expected-note {{function has been explicitly marked unavailable here}}
> +
> +void test_10095131() {
> +  ATSFontGetName("Hello"); // expected-warning {{'ATSFontGetName' is deprecated: first deprecated in Mac OS X 9.0 - use CTFontCopyFullName}}
> +  ATSFontGetPostScriptName(100); // expected-error {{'ATSFontGetPostScriptName' is unavailable: obsoleted in Mac OS X 9.0 - use ATSFontGetFullPostScriptName}}
> +}
> 
> 
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits




More information about the cfe-commits mailing list