diff --git a/src/shared/cplusplus/CheckDeclaration.cpp b/src/shared/cplusplus/CheckDeclaration.cpp
index dcb2364b11c6ccdc29b80de909089d9e9927deda..508e2e798b4853b53a6746437a6be99b04881148 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 2d1d2e404a9bbf949b19603cd1adf92ee604886f..a0c4f36995b664d1654ca04ee021e411e27b3a2a 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 7cbfdc88f02c3d48a32fcc1fe97f8d160e7c33c8..ac49493b50d23d6a1d98e45ee391b539c1520537 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 7001bca63a9db966dafe18ed8ad08e097bdf8daf..df882542dc86ddb8825a3abf92a6727277a4e93f 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 33bd7c92e8bca22f372a61a3c583da6f07902af6..46d81ede610892c544744fcebea49bd047a6429e 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,