diff options
author | Roberto Raggi <roberto.raggi@nokia.com> | 2010-03-24 15:02:46 +0100 |
---|---|---|
committer | Roberto Raggi <roberto.raggi@nokia.com> | 2010-03-24 15:06:50 +0100 |
commit | c05e11b165139dae9bbbb0d3b3adc518f9169ca6 (patch) | |
tree | 7a1561e85806d916dd561876f9e0ff0f02ff7bbf /src/shared/cplusplus | |
parent | 318bb4c3981fc1fff4c1ffad30875f20ee01d30f (diff) | |
download | qt-creator-c05e11b165139dae9bbbb0d3b3adc518f9169ca6.tar.gz |
Set and propagate the `auto' specifier.
Diffstat (limited to 'src/shared/cplusplus')
-rw-r--r-- | src/shared/cplusplus/CheckDeclaration.cpp | 5 | ||||
-rw-r--r-- | src/shared/cplusplus/CheckSpecifier.cpp | 7 | ||||
-rw-r--r-- | src/shared/cplusplus/FullySpecifiedType.cpp | 8 | ||||
-rw-r--r-- | src/shared/cplusplus/FullySpecifiedType.h | 4 | ||||
-rw-r--r-- | src/shared/cplusplus/Symbol.h | 1 |
5 files changed, 24 insertions, 1 deletions
diff --git a/src/shared/cplusplus/CheckDeclaration.cpp b/src/shared/cplusplus/CheckDeclaration.cpp index dcb2364b11..508e2e798b 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 2d1d2e404a..a0c4f36995 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 7cbfdc88f0..ac49493b50 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 7001bca63a..df882542dc 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 33bd7c92e8..46d81ede61 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, |