diff --git a/src/shared/cplusplus/CheckSpecifier.cpp b/src/shared/cplusplus/CheckSpecifier.cpp index f2c60c57de7e3ceaf0fd9775b41dafde2be37f26..183962f66d4af23407653e411f5b6c6031e186dd 100644 --- a/src/shared/cplusplus/CheckSpecifier.cpp +++ b/src/shared/cplusplus/CheckSpecifier.cpp @@ -439,8 +439,12 @@ bool CheckSpecifier::visit(TypeofSpecifierAST *ast) bool CheckSpecifier::visit(AttributeAST *ast) { if (ast->identifier_token) { - if (identifier(ast->identifier_token) == control()->deprecatedId()) + const Identifier *id = identifier(ast->identifier_token); + + if (id == control()->deprecatedId()) _fullySpecifiedType.setDeprecated(true); + else if (id == control()->unavailableId()) + _fullySpecifiedType.setUnavailable(true); } return false; } diff --git a/src/shared/cplusplus/Control.cpp b/src/shared/cplusplus/Control.cpp index a456bcc20969c6aad6b3932f67917ecca7491ea0..14c07a0f25aaebcc8dee60c9024f2cb451202b10 100644 --- a/src/shared/cplusplus/Control.cpp +++ b/src/shared/cplusplus/Control.cpp @@ -516,6 +516,7 @@ public: std::vector<Symbol *> symbols; const Identifier *deprecatedId; + const Identifier *unavailableId; // ObjC context keywords: const Identifier *objcGetterId; const Identifier *objcSetterId; @@ -532,6 +533,7 @@ Control::Control() d = new Data(this); d->deprecatedId = findOrInsertIdentifier("deprecated"); + d->unavailableId = findOrInsertIdentifier("unavailable"); d->objcGetterId = findOrInsertIdentifier("getter"); d->objcSetterId = findOrInsertIdentifier("setter"); @@ -736,6 +738,9 @@ ObjCPropertyDeclaration *Control::newObjCPropertyDeclaration(unsigned sourceLoca const Identifier *Control::deprecatedId() const { return d->deprecatedId; } +const Identifier *Control::unavailableId() const +{ return d->unavailableId; } + const Identifier *Control::objcGetterId() const { return d->objcGetterId; } diff --git a/src/shared/cplusplus/Control.h b/src/shared/cplusplus/Control.h index d46c7093aefad32507aba95215fa27a5695ec8dd..187dc10a0ef4e0161c6c1a6ff72903f1b4c79615 100644 --- a/src/shared/cplusplus/Control.h +++ b/src/shared/cplusplus/Control.h @@ -177,6 +177,7 @@ public: ObjCPropertyDeclaration *newObjCPropertyDeclaration(unsigned sourceLocation, const Name *name); const Identifier *deprecatedId() const; + const Identifier *unavailableId() const; // Objective-C specific context keywords. const Identifier *objcGetterId() const; const Identifier *objcSetterId() const; diff --git a/src/shared/cplusplus/FullySpecifiedType.cpp b/src/shared/cplusplus/FullySpecifiedType.cpp index ac49493b50d23d6a1d98e45ee391b539c1520537..da6c16a54a2de19c504bde4590c609c3424ead4a 100644 --- a/src/shared/cplusplus/FullySpecifiedType.cpp +++ b/src/shared/cplusplus/FullySpecifiedType.cpp @@ -87,6 +87,7 @@ FullySpecifiedType FullySpecifiedType::qualifiedType() const ty.setExplicit(false); ty.setDeprecated(false); + ty.setUnavailable(false); return ty; } @@ -180,6 +181,12 @@ bool FullySpecifiedType::isDeprecated() const void FullySpecifiedType::setDeprecated(bool isDeprecated) { f._isDeprecated = isDeprecated; } +bool FullySpecifiedType::isUnavailable() const +{ return f._isUnavailable; } + +void FullySpecifiedType::setUnavailable(bool isUnavailable) +{ f._isUnavailable = isUnavailable; } + bool FullySpecifiedType::isEqualTo(const FullySpecifiedType &other) const { if (_flags != other._flags) diff --git a/src/shared/cplusplus/FullySpecifiedType.h b/src/shared/cplusplus/FullySpecifiedType.h index df882542dc86ddb8825a3abf92a6727277a4e93f..7905df162de6c95e3977ef0392ff8ca582a66e13 100644 --- a/src/shared/cplusplus/FullySpecifiedType.h +++ b/src/shared/cplusplus/FullySpecifiedType.h @@ -113,6 +113,9 @@ public: bool isDeprecated() const; void setDeprecated(bool isDeprecated); + bool isUnavailable() const; + void setUnavailable(bool isUnavailable); + bool isEqualTo(const FullySpecifiedType &other) const; Type &operator*(); @@ -158,6 +161,7 @@ private: // speficiers from attributes unsigned _isDeprecated: 1; + unsigned _isUnavailable: 1; }; union { unsigned _flags;