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