diff options
Diffstat (limited to 'clang/include')
-rw-r--r-- | clang/include/clang/Basic/Attr.td | 4 | ||||
-rw-r--r-- | clang/include/clang/Basic/DiagnosticParseKinds.td | 2 | ||||
-rw-r--r-- | clang/include/clang/Parse/Parser.h | 3 | ||||
-rw-r--r-- | clang/include/clang/Sema/AttributeList.h | 29 |
4 files changed, 30 insertions, 8 deletions
diff --git a/clang/include/clang/Basic/Attr.td b/clang/include/clang/Basic/Attr.td index 03bdc334f75..308315cb32f 100644 --- a/clang/include/clang/Basic/Attr.td +++ b/clang/include/clang/Basic/Attr.td @@ -46,6 +46,7 @@ class Argument<string name> { string Name = name; } +class BoolArgument<string name> : Argument<name>; class IdentifierArgument<string name> : Argument<name>; class IntArgument<string name> : Argument<name>; class StringArgument<string name> : Argument<name>; @@ -140,7 +141,8 @@ def AsmLabel : InheritableAttr { def Availability : InheritableAttr { let Spellings = ["availability"]; let Args = [IdentifierArgument<"platform">, VersionArgument<"introduced">, - VersionArgument<"deprecated">, VersionArgument<"obsoleted">]; + VersionArgument<"deprecated">, VersionArgument<"obsoleted">, + BoolArgument<"unavailable">]; let AdditionalMembers = [{static llvm::StringRef getPrettyPlatformName(llvm::StringRef Platform) { return llvm::StringSwitch<llvm::StringRef>(Platform) diff --git a/clang/include/clang/Basic/DiagnosticParseKinds.td b/clang/include/clang/Basic/DiagnosticParseKinds.td index 544318356c7..9aada071214 100644 --- a/clang/include/clang/Basic/DiagnosticParseKinds.td +++ b/clang/include/clang/Basic/DiagnosticParseKinds.td @@ -445,6 +445,8 @@ def err_availability_unknown_change : Error< "'obsoleted'">; def err_availability_redundant : Error< "redundant %0 availability change; only the last specified change will " "be used">; +def warn_availability_and_unavailable : Warning< + "'unavailable' availability overrides all other availability information">; // Language specific pragmas // - Generic warnings diff --git a/clang/include/clang/Parse/Parser.h b/clang/include/clang/Parse/Parser.h index d15ef01b092..b506dba0373 100644 --- a/clang/include/clang/Parse/Parser.h +++ b/clang/include/clang/Parse/Parser.h @@ -121,6 +121,9 @@ class Parser : public CodeCompletionHandler { /// \brief Identifier for "obsoleted". IdentifierInfo *Ident_obsoleted; + /// \brief Identifier for "unavailable". + IdentifierInfo *Ident_unavailable; + /// C++0x contextual keywords. mutable IdentifierInfo *Ident_final; mutable IdentifierInfo *Ident_override; diff --git a/clang/include/clang/Sema/AttributeList.h b/clang/include/clang/Sema/AttributeList.h index 8e05c62880e..fa2f94379eb 100644 --- a/clang/include/clang/Sema/AttributeList.h +++ b/clang/include/clang/Sema/AttributeList.h @@ -62,20 +62,24 @@ private: /// The number of expression arguments this attribute has. /// The expressions themselves are stored after the object. - unsigned NumArgs; + unsigned NumArgs : 16; /// True if Microsoft style: declspec(foo). - bool DeclspecAttribute; + unsigned DeclspecAttribute : 1; /// True if C++0x-style: [[foo]]. - bool CXX0XAttribute; + unsigned CXX0XAttribute : 1; /// True if already diagnosed as invalid. - mutable bool Invalid; + mutable unsigned Invalid : 1; /// True if this has the extra information associated with an /// availability attribute. - bool IsAvailability; + unsigned IsAvailability : 1; + + /// \brief The location of the 'unavailable' keyword in an + /// availability attribute. + SourceLocation UnavailableLoc; /// The next attribute in the current position. AttributeList *NextInPosition; @@ -127,11 +131,13 @@ private: const AvailabilityChange &introduced, const AvailabilityChange &deprecated, const AvailabilityChange &obsoleted, + SourceLocation unavailable, bool declspec, bool cxx0x) : AttrName(attrName), ScopeName(scopeName), ParmName(parmName), AttrLoc(attrLoc), ScopeLoc(scopeLoc), ParmLoc(parmLoc), NumArgs(0), DeclspecAttribute(declspec), CXX0XAttribute(cxx0x), - Invalid(false), IsAvailability(true), NextInPosition(0), NextInPool(0) { + Invalid(false), IsAvailability(true), UnavailableLoc(unavailable), + NextInPosition(0), NextInPool(0) { new (&getAvailabilitySlot(IntroducedSlot)) AvailabilityChange(introduced); new (&getAvailabilitySlot(DeprecatedSlot)) AvailabilityChange(deprecated); new (&getAvailabilitySlot(ObsoletedSlot)) AvailabilityChange(obsoleted); @@ -315,6 +321,11 @@ public: assert(getKind() == AT_availability && "Not an availability attribute"); return getAvailabilitySlot(ObsoletedSlot); } + + SourceLocation getUnavailableLoc() const { + assert(getKind() == AT_availability && "Not an availability attribute"); + return UnavailableLoc; + } }; /// A factory, from which one makes pools, from which one creates @@ -435,12 +446,14 @@ public: const AvailabilityChange &introduced, const AvailabilityChange &deprecated, const AvailabilityChange &obsoleted, + SourceLocation unavailable, bool declspec = false, bool cxx0x = false) { void *memory = allocate(AttributeFactory::AvailabilityAllocSize); return add(new (memory) AttributeList(attrName, attrLoc, scopeName, scopeLoc, parmName, parmLoc, introduced, deprecated, obsoleted, + unavailable, declspec, cxx0x)); } @@ -557,10 +570,12 @@ public: const AvailabilityChange &introduced, const AvailabilityChange &deprecated, const AvailabilityChange &obsoleted, + SourceLocation unavailable, bool declspec = false, bool cxx0x = false) { AttributeList *attr = pool.create(attrName, attrLoc, scopeName, scopeLoc, parmName, parmLoc, - introduced, deprecated, obsoleted, declspec, cxx0x); + introduced, deprecated, obsoleted, unavailable, + declspec, cxx0x); add(attr); return attr; } |