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

---
 src/shared/cplusplus/CheckDeclaration.cpp | 12 ++++++++++++
 src/shared/cplusplus/CheckSpecifier.cpp   |  2 ++
 src/shared/cplusplus/Symbol.cpp           | 10 +++++++++-
 src/shared/cplusplus/Symbol.h             |  4 ++++
 4 files changed, 27 insertions(+), 1 deletion(-)

diff --git a/src/shared/cplusplus/CheckDeclaration.cpp b/src/shared/cplusplus/CheckDeclaration.cpp
index ec8ddfcc4ca..467e28c92dc 100644
--- a/src/shared/cplusplus/CheckDeclaration.cpp
+++ b/src/shared/cplusplus/CheckDeclaration.cpp
@@ -177,6 +177,8 @@ bool CheckDeclaration::visit(SimpleDeclarationAST *ast)
 
             if (ty.isDeprecated())
                 symbol->setDeprecated(true);
+            if (ty.isUnavailable())
+                symbol->setUnavailable(true);
 
             if (ty.isFriend())
                 symbol->setStorage(Symbol::Friend);
@@ -213,6 +215,8 @@ bool CheckDeclaration::visit(SimpleDeclarationAST *ast)
             fun->setVirtual(ty.isVirtual());
             if (ty.isDeprecated())
                 fun->setDeprecated(true);
+            if (ty.isUnavailable())
+                fun->setUnavailable(true);
             if (isQ_SIGNAL)
                 fun->setMethodKey(Function::SignalMethod);
             else if (isQ_SLOT)
@@ -232,6 +236,8 @@ bool CheckDeclaration::visit(SimpleDeclarationAST *ast)
         symbol->setType(declTy);
         if (declTy.isDeprecated())
             symbol->setDeprecated(true);
+        if (declTy.isUnavailable())
+            symbol->setUnavailable(true);
 
         if (_templateParameters && it == ast->declarator_list) {
             symbol->setTemplateParameters(_templateParameters);
@@ -257,6 +263,8 @@ bool CheckDeclaration::visit(SimpleDeclarationAST *ast)
 
         if (ty.isDeprecated())
             symbol->setDeprecated(true);
+        if (ty.isUnavailable())
+            symbol->setUnavailable(true);
 
         if (it->value && it->value->initializer) {
             FullySpecifiedType initTy = semantic()->check(it->value->initializer, _scope);
@@ -338,6 +346,8 @@ bool CheckDeclaration::visit(FunctionDefinitionAST *ast)
     fun->setVirtual(ty.isVirtual());
     if (ty.isDeprecated())
         fun->setDeprecated(true);
+    if (ty.isUnavailable())
+        fun->setUnavailable(true);
     fun->setStartOffset(tokenAt(ast->firstToken()).offset);
     fun->setEndOffset(tokenAt(ast->lastToken()).offset);
     if (ast->declarator)
@@ -727,6 +737,8 @@ bool CheckDeclaration::visit(ObjCMethodDeclarationAST *ast)
     symbol->setVisibility(semantic()->currentObjCVisibility());
     if (ty.isDeprecated())
         symbol->setDeprecated(true);
+    if (ty.isUnavailable())
+        symbol->setUnavailable(true);
 
     _scope->enterSymbol(symbol);
 
diff --git a/src/shared/cplusplus/CheckSpecifier.cpp b/src/shared/cplusplus/CheckSpecifier.cpp
index 183962f66d4..ee390d285f6 100644
--- a/src/shared/cplusplus/CheckSpecifier.cpp
+++ b/src/shared/cplusplus/CheckSpecifier.cpp
@@ -346,6 +346,8 @@ bool CheckSpecifier::visit(ClassSpecifierAST *ast)
 
     if (_fullySpecifiedType.isDeprecated())
         klass->setDeprecated(true);
+    if (_fullySpecifiedType.isUnavailable())
+        klass->setUnavailable(true);
 
     for (BaseSpecifierListAST *it = ast->base_clause_list; it; it = it->next) {
         BaseSpecifierAST *base = it->value;
diff --git a/src/shared/cplusplus/Symbol.cpp b/src/shared/cplusplus/Symbol.cpp
index 63672f13c00..1b38da597be 100644
--- a/src/shared/cplusplus/Symbol.cpp
+++ b/src/shared/cplusplus/Symbol.cpp
@@ -170,7 +170,9 @@ Symbol::Symbol(TranslationUnit *translationUnit, unsigned sourceLocation, const
       _scope(0),
       _index(0),
       _next(0),
-      _isGenerated(false)
+      _isGenerated(false),
+      _isDeprecated(false),
+      _isUnavailable(false)
 {
     setSourceLocation(sourceLocation, translationUnit);
     setName(name);
@@ -206,6 +208,12 @@ bool Symbol::isDeprecated() const
 void Symbol::setDeprecated(bool isDeprecated)
 { _isDeprecated = isDeprecated; }
 
+bool Symbol::isUnavailable() const
+{ return _isUnavailable; }
+
+void Symbol::setUnavailable(bool isUnavailable)
+{ _isUnavailable = isUnavailable; }
+
 void Symbol::setSourceLocation(unsigned sourceLocation, TranslationUnit *translationUnit)
 {
     _sourceLocation = sourceLocation;
diff --git a/src/shared/cplusplus/Symbol.h b/src/shared/cplusplus/Symbol.h
index e0fe2b01be9..98ce58bd8d4 100644
--- a/src/shared/cplusplus/Symbol.h
+++ b/src/shared/cplusplus/Symbol.h
@@ -287,6 +287,9 @@ public:
     bool isDeprecated() const;
     void setDeprecated(bool isDeprecated);
 
+    bool isUnavailable() const;
+    void setUnavailable(bool isUnavailable);
+
     Symbol *enclosingSymbol() const;
 
     /// Returns the eclosing namespace scope.
@@ -332,6 +335,7 @@ private:
 
     bool _isGenerated: 1;
     bool _isDeprecated: 1;
+    bool _isUnavailable: 1;
 
     class IdentityForName;
     class HashCode;
-- 
GitLab