From 51fbf9695ccb07e853c04ac77d31926ada2afaa2 Mon Sep 17 00:00:00 2001
From: Erik Verbruggen <erik.verbruggen@nokia.com>
Date: Wed, 26 May 2010 13:49:06 +0200
Subject: [PATCH] Added support for the GCC "unavailable" attribute.

---
 src/shared/cplusplus/CheckSpecifier.cpp     | 6 +++++-
 src/shared/cplusplus/Control.cpp            | 5 +++++
 src/shared/cplusplus/Control.h              | 1 +
 src/shared/cplusplus/FullySpecifiedType.cpp | 7 +++++++
 src/shared/cplusplus/FullySpecifiedType.h   | 4 ++++
 5 files changed, 22 insertions(+), 1 deletion(-)

diff --git a/src/shared/cplusplus/CheckSpecifier.cpp b/src/shared/cplusplus/CheckSpecifier.cpp
index f2c60c57de7..183962f66d4 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 a456bcc2096..14c07a0f25a 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 d46c7093aef..187dc10a0ef 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 ac49493b50d..da6c16a54a2 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 df882542dc8..7905df162de 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;
-- 
GitLab