summaryrefslogtreecommitdiffstats
path: root/clang/include
diff options
context:
space:
mode:
Diffstat (limited to 'clang/include')
-rw-r--r--clang/include/clang/Basic/Attr.td4
-rw-r--r--clang/include/clang/Basic/DiagnosticParseKinds.td2
-rw-r--r--clang/include/clang/Parse/Parser.h3
-rw-r--r--clang/include/clang/Sema/AttributeList.h29
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;
}
OpenPOWER on IntegriCloud