summaryrefslogtreecommitdiff
path: root/src/shared/cplusplus
diff options
context:
space:
mode:
authorRoberto Raggi <roberto.raggi@nokia.com>2010-03-24 15:02:46 +0100
committerRoberto Raggi <roberto.raggi@nokia.com>2010-03-24 15:06:50 +0100
commitc05e11b165139dae9bbbb0d3b3adc518f9169ca6 (patch)
tree7a1561e85806d916dd561876f9e0ff0f02ff7bbf /src/shared/cplusplus
parent318bb4c3981fc1fff4c1ffad30875f20ee01d30f (diff)
downloadqt-creator-c05e11b165139dae9bbbb0d3b3adc518f9169ca6.tar.gz
Set and propagate the `auto' specifier.
Diffstat (limited to 'src/shared/cplusplus')
-rw-r--r--src/shared/cplusplus/CheckDeclaration.cpp5
-rw-r--r--src/shared/cplusplus/CheckSpecifier.cpp7
-rw-r--r--src/shared/cplusplus/FullySpecifiedType.cpp8
-rw-r--r--src/shared/cplusplus/FullySpecifiedType.h4
-rw-r--r--src/shared/cplusplus/Symbol.h1
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,