From c05e11b165139dae9bbbb0d3b3adc518f9169ca6 Mon Sep 17 00:00:00 2001
From: Roberto Raggi <roberto.raggi@nokia.com>
Date: Wed, 24 Mar 2010 15:02:46 +0100
Subject: [PATCH] Set and propagate the `auto' specifier.

---
 src/shared/cplusplus/CheckDeclaration.cpp   | 5 ++++-
 src/shared/cplusplus/CheckSpecifier.cpp     | 7 +++++++
 src/shared/cplusplus/FullySpecifiedType.cpp | 8 ++++++++
 src/shared/cplusplus/FullySpecifiedType.h   | 4 ++++
 src/shared/cplusplus/Symbol.h               | 1 +
 5 files changed, 24 insertions(+), 1 deletion(-)

diff --git a/src/shared/cplusplus/CheckDeclaration.cpp b/src/shared/cplusplus/CheckDeclaration.cpp
index dcb2364b11c..508e2e798b4 100644
--- a/src/shared/cplusplus/CheckDeclaration.cpp
+++ b/src/shared/cplusplus/CheckDeclaration.cpp
@@ -231,6 +231,8 @@ bool CheckDeclaration::visit(SimpleDeclarationAST *ast)
 
         if (ty.isFriend())
             symbol->setStorage(Symbol::Friend);
+        else if (ty.isAuto())
+            symbol->setStorage(Symbol::Auto);
         else if (ty.isRegister())
             symbol->setStorage(Symbol::Register);
         else if (ty.isStatic())
@@ -241,7 +243,8 @@ bool CheckDeclaration::visit(SimpleDeclarationAST *ast)
             symbol->setStorage(Symbol::Mutable);
         else if (ty.isTypedef())
             symbol->setStorage(Symbol::Typedef);
-        else if (ty.isDeprecated())
+
+        if (ty.isDeprecated())
             symbol->setDeprecated(true);
 
         if (it->value && it->value->initializer) {
diff --git a/src/shared/cplusplus/CheckSpecifier.cpp b/src/shared/cplusplus/CheckSpecifier.cpp
index 2d1d2e404a9..a0c4f36995b 100644
--- a/src/shared/cplusplus/CheckSpecifier.cpp
+++ b/src/shared/cplusplus/CheckSpecifier.cpp
@@ -140,6 +140,13 @@ bool CheckSpecifier::visit(SimpleSpecifierAST *ast)
             _fullySpecifiedType.setFriend(true);
             break;
 
+        case T_AUTO:
+            if (_fullySpecifiedType.isAuto())
+                translationUnit()->error(ast->specifier_token,
+                                         "duplicate `%s'", spell(ast->specifier_token));
+            _fullySpecifiedType.setAuto(true);
+            break;
+
         case T_REGISTER:
             if (_fullySpecifiedType.isRegister())
                 translationUnit()->error(ast->specifier_token,
diff --git a/src/shared/cplusplus/FullySpecifiedType.cpp b/src/shared/cplusplus/FullySpecifiedType.cpp
index 7cbfdc88f02..ac49493b50d 100644
--- a/src/shared/cplusplus/FullySpecifiedType.cpp
+++ b/src/shared/cplusplus/FullySpecifiedType.cpp
@@ -75,6 +75,7 @@ FullySpecifiedType FullySpecifiedType::qualifiedType() const
 {
     FullySpecifiedType ty = *this;
     ty.setFriend(false);
+    ty.setAuto(false);
     ty.setRegister(false);
     ty.setStatic(false);
     ty.setExtern(false);
@@ -119,6 +120,12 @@ bool FullySpecifiedType::isFriend() const
 void FullySpecifiedType::setFriend(bool isFriend)
 { f._isFriend = isFriend; }
 
+bool FullySpecifiedType::isAuto() const
+{ return f._isAuto; }
+
+void FullySpecifiedType::setAuto(bool isAuto)
+{ f._isAuto = isAuto; }
+
 bool FullySpecifiedType::isRegister() const
 { return f._isRegister; }
 
@@ -225,6 +232,7 @@ void FullySpecifiedType::copySpecifiers(const FullySpecifiedType &type)
 {
     // class storage specifiers
     f._isFriend = type.f._isFriend;
+    f._isAuto = type.f._isAuto;
     f._isRegister = type.f._isRegister;
     f._isStatic = type.f._isStatic;
     f._isExtern = type.f._isExtern;
diff --git a/src/shared/cplusplus/FullySpecifiedType.h b/src/shared/cplusplus/FullySpecifiedType.h
index 7001bca63a9..df882542dc8 100644
--- a/src/shared/cplusplus/FullySpecifiedType.h
+++ b/src/shared/cplusplus/FullySpecifiedType.h
@@ -83,6 +83,9 @@ public:
     bool isFriend() const;
     void setFriend(bool isFriend);
 
+    bool isAuto() const;
+    void setAuto(bool isAuto);
+
     bool isRegister() const;
     void setRegister(bool isRegister);
 
@@ -141,6 +144,7 @@ private:
 
         // storage class specifiers
         unsigned _isFriend: 1;
+        unsigned _isAuto: 1;
         unsigned _isRegister: 1;
         unsigned _isStatic: 1;
         unsigned _isExtern: 1;
diff --git a/src/shared/cplusplus/Symbol.h b/src/shared/cplusplus/Symbol.h
index 33bd7c92e8b..46d81ede610 100644
--- a/src/shared/cplusplus/Symbol.h
+++ b/src/shared/cplusplus/Symbol.h
@@ -64,6 +64,7 @@ public:
     enum Storage {
         NoStorage = 0,
         Friend,
+        Auto,
         Register,
         Static,
         Extern,
-- 
GitLab