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,