From cdb144321926d1c43242deeaffa0fb8e55873014 Mon Sep 17 00:00:00 2001
From: Roberto Raggi <roberto.raggi@nokia.com>
Date: Tue, 10 Nov 2009 16:00:22 +0100
Subject: [PATCH] Cleanup specifiers.

---
 src/libs/cplusplus/CheckUndefinedSymbols.cpp |  11 +-
 src/libs/cplusplus/FindUsages.cpp            |  19 ++-
 src/shared/cplusplus/AST.cpp                 | 149 ++++++++-----------
 src/shared/cplusplus/AST.h                   |  53 ++++---
 src/shared/cplusplus/ASTVisit.cpp            | 106 +++++--------
 src/shared/cplusplus/ASTfwd.h                |   1 +
 src/shared/cplusplus/CheckDeclaration.cpp    |   2 +-
 src/shared/cplusplus/CheckDeclarator.cpp     |  11 +-
 src/shared/cplusplus/CheckDeclarator.h       |   2 +-
 src/shared/cplusplus/CheckSpecifier.cpp      |  18 +--
 src/shared/cplusplus/CheckSpecifier.h        |   8 +-
 src/shared/cplusplus/Parser.cpp              | 112 +++++++-------
 src/shared/cplusplus/Parser.h                |  26 ++--
 src/shared/cplusplus/Semantic.cpp            |   2 +-
 src/shared/cplusplus/Semantic.h              |   2 +-
 tests/auto/cplusplus/ast/tst_ast.cpp         |  16 +-
 16 files changed, 235 insertions(+), 303 deletions(-)

diff --git a/src/libs/cplusplus/CheckUndefinedSymbols.cpp b/src/libs/cplusplus/CheckUndefinedSymbols.cpp
index 8be3d032895..f570f548185 100644
--- a/src/libs/cplusplus/CheckUndefinedSymbols.cpp
+++ b/src/libs/cplusplus/CheckUndefinedSymbols.cpp
@@ -244,9 +244,8 @@ void CheckUndefinedSymbols::endVisit(FunctionDeclaratorAST *)
     _functionDeclaratorStack.removeLast();
 }
 
-bool CheckUndefinedSymbols::visit(TypeofSpecifierAST *ast)
+bool CheckUndefinedSymbols::visit(TypeofSpecifierAST *)
 {
-    accept(ast->next);
     return false;
 }
 
@@ -425,9 +424,9 @@ bool CheckUndefinedSymbols::visit(CastExpressionAST *ast)
 {
     if (ast->lparen_token && ast->type_id && ast->rparen_token && ast->expression) {
         if (TypeIdAST *cast_type_id = ast->type_id->asTypeId()) {
-            SpecifierAST *type_specifier = cast_type_id->type_specifier;
+            SpecifierListAST *type_specifier = cast_type_id->type_specifier;
             if (! cast_type_id->declarator && type_specifier && ! type_specifier->next &&
-                type_specifier->asNamedTypeSpecifier() && ast->expression &&
+                type_specifier->value->asNamedTypeSpecifier() && ast->expression &&
                 ast->expression->asUnaryExpression()) {
                 // this ast node is ambigious, e.g.
                 //   (a) + b
@@ -448,9 +447,9 @@ bool CheckUndefinedSymbols::visit(SizeofExpressionAST *ast)
 {
     if (ast->lparen_token && ast->expression && ast->rparen_token) {
         if (TypeIdAST *type_id = ast->expression->asTypeId()) {
-            SpecifierAST *type_specifier = type_id->type_specifier;
+            SpecifierListAST *type_specifier = type_id->type_specifier;
             if (! type_id->declarator && type_specifier && ! type_specifier->next &&
-                type_specifier->asNamedTypeSpecifier()) {
+                type_specifier->value->asNamedTypeSpecifier()) {
                 // this sizeof expression is ambiguos, e.g.
                 // sizeof (a)
                 //   `a' can be a typeid or a nested-expression.
diff --git a/src/libs/cplusplus/FindUsages.cpp b/src/libs/cplusplus/FindUsages.cpp
index 659d25b25ad..59ee3702f41 100644
--- a/src/libs/cplusplus/FindUsages.cpp
+++ b/src/libs/cplusplus/FindUsages.cpp
@@ -402,16 +402,15 @@ bool FindUsages::visit(TemplateIdAST *ast)
 
 bool FindUsages::visit(ParameterDeclarationAST *ast)
 {
-    for (SpecifierAST *spec = ast->type_specifier; spec; spec = spec->next)
-        accept(spec);
+    for (SpecifierListAST *it = ast->type_specifier; it; it = it->next)
+        accept(it->value);
 
     if (DeclaratorAST *declarator = ast->declarator) {
-        for (SpecifierAST *attr = declarator->attributes; attr; attr = attr->next)
-            accept(attr);
+        for (SpecifierListAST *it = declarator->attributes; it; it = it->next)
+            accept(it->value);
 
-        for (PtrOperatorListAST *it = declarator->ptr_operators; it; it = it->next) {
+        for (PtrOperatorListAST *it = declarator->ptr_operators; it; it = it->next)
             accept(it->value);
-        }
 
         if (! _inSimpleDeclaration) // visit the core declarator only if we are not in simple-declaration.
             accept(declarator->core_declarator);
@@ -419,8 +418,8 @@ bool FindUsages::visit(ParameterDeclarationAST *ast)
         for (PostfixDeclaratorListAST *it = declarator->postfix_declarators; it; it = it->next)
             accept(it->value);
 
-        for (SpecifierAST *spec = declarator->post_attributes; spec; spec = spec->next)
-            accept(spec);
+        for (SpecifierListAST *it = declarator->post_attributes; it; it = it->next)
+            accept(it->value);
 
         accept(declarator->initializer);
     }
@@ -439,8 +438,8 @@ bool FindUsages::visit(FunctionDeclaratorAST *ast)
 {
     accept(ast->parameters);
 
-    for (SpecifierAST *spec = ast->cv_qualifier_seq; spec; spec = spec->next)
-        accept(spec);
+    for (SpecifierListAST *it = ast->cv_qualifier_seq; it; it = it->next)
+        accept(it->value);
 
     accept(ast->exception_specification);
 
diff --git a/src/shared/cplusplus/AST.cpp b/src/shared/cplusplus/AST.cpp
index 8785ad6f097..825c7506b99 100644
--- a/src/shared/cplusplus/AST.cpp
+++ b/src/shared/cplusplus/AST.cpp
@@ -391,10 +391,8 @@ unsigned ClassSpecifierAST::lastToken() const
     else if (name)
         return name->lastToken();
 
-    for (SpecifierAST *it = attributes; it; it = it->next) {
-        if (! it->next)
-            return it->lastToken();
-    }
+    else if (attributes)
+        return attributes->lastToken();
 
     return classkey_token + 1;
 }
@@ -409,10 +407,8 @@ unsigned CompoundStatementAST::lastToken() const
     if (rbrace_token)
         return rbrace_token + 1;
 
-    for (StatementListAST *it = statements; it; it = it->next) {
-        if (! it->next)
-            return it->value->lastToken();
-    }
+    else if (statements)
+        return statements->lastToken();
 
     return lbrace_token + 1;
 }
@@ -431,10 +427,8 @@ unsigned ConditionAST::lastToken() const
     if (declarator)
         return declarator->lastToken();
 
-    for (SpecifierAST *it = type_specifier; it; it = it->next) {
-        if (! it->next)
-            return it->lastToken();
-    }
+    else if (type_specifier)
+        return type_specifier->lastToken();
 
     // ### assert?
     return 0;
@@ -486,10 +480,8 @@ unsigned ConversionFunctionIdAST::lastToken() const
     if (ptr_operators)
         return ptr_operators->lastToken();
 
-    for (SpecifierAST *it = type_specifier; it; it = it->next) {
-        if (! it->next)
-            return it->lastToken();
-    }
+    else if (type_specifier)
+        return type_specifier->lastToken();
 
     return operator_token + 1;
 }
@@ -553,24 +545,20 @@ unsigned DeclaratorAST::lastToken() const
     if (initializer)
         return initializer->lastToken();
 
-    for (SpecifierAST *it = post_attributes; it; it = it->next) {
-        if (! it->next)
-            return it->lastToken();
-    }
+    else if (post_attributes)
+        return post_attributes->lastToken();
 
-    if (postfix_declarators)
+    else if (postfix_declarators)
         return postfix_declarators->lastToken();
 
-    if (core_declarator)
+    else if (core_declarator)
         return core_declarator->lastToken();
 
-    if (ptr_operators)
+    else if (ptr_operators)
         return ptr_operators->lastToken();
 
-    for (SpecifierAST *it = attributes; it; it = it->next) {
-        if (! it->next)
-            return it->lastToken();
-    }
+    else if (attributes)
+        return attributes->lastToken();
 
     // ### assert?
     return 0;
@@ -729,12 +717,13 @@ unsigned ExceptionDeclarationAST::lastToken() const
 {
     if (dot_dot_dot_token)
         return dot_dot_dot_token + 1;
+
     else if (declarator)
         return declarator->lastToken();
-    for (SpecifierAST *it = type_specifier; it; it = it->next) {
-        if (! it->next)
-            return it->lastToken();
-    }
+
+    else if (type_specifier)
+        return type_specifier->lastToken();
+
     return 0;
 }
 
@@ -845,13 +834,12 @@ unsigned FunctionDeclaratorAST::lastToken() const
     if (exception_specification)
         return exception_specification->lastToken();
 
-    for (SpecifierAST *it = cv_qualifier_seq; it; it = it->next) {
-        if (! it->next)
-            return it->lastToken();
-    }
+    else if (cv_qualifier_seq)
+        return cv_qualifier_seq->lastToken();
 
-    if (rparen_token)
+    else if (rparen_token)
         return rparen_token + 1;
+
     else if (parameters)
         return parameters->lastToken();
 
@@ -874,15 +862,15 @@ unsigned FunctionDefinitionAST::lastToken() const
 {
     if (function_body)
         return function_body->lastToken();
+
     else if (ctor_initializer)
         return ctor_initializer->lastToken();
-    if (declarator)
+
+    else if (declarator)
         return declarator->lastToken();
 
-    for (SpecifierAST *it = decl_specifier_seq; it; it = it->next) {
-        if (! it->next)
-            return it->lastToken();
-    }
+    else if (decl_specifier_seq)
+        return decl_specifier_seq->lastToken();
 
     // ### assert
     return 0;
@@ -1032,12 +1020,10 @@ unsigned NamespaceAST::lastToken() const
     if (linkage_body)
         return linkage_body->lastToken();
 
-    for (SpecifierAST *it = attributes; it; it = it->next) {
-        if (! it->next)
-            return it->lastToken();
-    }
+    else if (attributes)
+        return attributes->lastToken();
 
-    if (identifier_token)
+    else if (identifier_token)
         return identifier_token + 1;
 
     return namespace_token + 1;
@@ -1231,14 +1217,16 @@ unsigned ParameterDeclarationAST::lastToken() const
 {
     if (expression)
         return expression->lastToken();
+
     else if (equal_token)
         return equal_token + 1;
+
     else if (declarator)
         return declarator->lastToken();
-    for (SpecifierAST *it = type_specifier; it; it = it->next) {
-        if (! it->next)
-            return it->lastToken();
-    }
+
+    else if (type_specifier)
+        return type_specifier->lastToken();
+
     // ### assert?
     return 0;
 }
@@ -1266,10 +1254,9 @@ unsigned PointerAST::firstToken() const
 
 unsigned PointerAST::lastToken() const
 {
-    for (SpecifierAST *it = cv_qualifier_seq; it; it = it->next) {
-        if (! it->next)
-            return it->lastToken();
-    }
+    if (cv_qualifier_seq)
+        return cv_qualifier_seq->lastToken();
+
     return star_token + 1;
 }
 
@@ -1285,12 +1272,10 @@ unsigned PointerToMemberAST::firstToken() const
 
 unsigned PointerToMemberAST::lastToken() const
 {
-    for (SpecifierAST *it = cv_qualifier_seq; it; it = it->next) {
-        if (! it->next)
-            return it->lastToken();
-    }
+    if (cv_qualifier_seq)
+        return cv_qualifier_seq->lastToken();
 
-    if (star_token)
+    else if (star_token)
         return star_token + 1;
 
     else if (nested_name_specifier)
@@ -1299,6 +1284,7 @@ unsigned PointerToMemberAST::lastToken() const
     else if (global_scope_token)
         return global_scope_token + 1;
 
+    // ### assert(0);
     return 0;
 }
 
@@ -1391,18 +1377,16 @@ unsigned SimpleDeclarationAST::lastToken() const
     if (semicolon_token)
         return semicolon_token + 1;
 
-    if (declarators)
+    else if (declarators)
         return declarators->lastToken();
 
-    for (SpecifierAST *it = decl_specifier_seq; it; it = it->next) {
-        if (! it->next)
-            return it->lastToken();
-    }
+    else if (decl_specifier_seq)
+        return decl_specifier_seq->lastToken();
 
+    // ### assert(0);
     return 0;
 }
 
-
 unsigned SimpleNameAST::firstToken() const
 {
     return identifier_token;
@@ -1630,20 +1614,16 @@ unsigned TypeConstructorCallAST::lastToken() const
     if (rparen_token)
         return rparen_token + 1;
 
-    for (ExpressionListAST *it = expression_list; it; it = it->next) {
-        if (! it->next)
-            return it->lastToken();
-    }
+    else if (expression_list)
+        return expression_list->lastToken();
 
-    if (lparen_token)
+    else if (lparen_token)
         return lparen_token + 1;
 
+    else if (type_specifier)
+        return type_specifier->lastToken();
 
-    for (SpecifierAST *it = type_specifier; it; it = it->next) {
-        if (! it->next)
-            return it->lastToken();
-    }
-
+    // ### assert(0);
     return 0;
 }
 
@@ -1658,11 +1638,10 @@ unsigned TypeIdAST::lastToken() const
     if (declarator)
         return declarator->lastToken();
 
-    for (SpecifierAST *it = type_specifier; it; it = it->next) {
-        if (! it->next)
-            return it->lastToken();
-    }
+    else if (type_specifier)
+        return type_specifier->lastToken();
 
+    // ### assert(0);
     return 0;
 }
 
@@ -1879,19 +1858,17 @@ unsigned ObjCProtocolDeclarationAST::lastToken() const
     if (end_token)
         return end_token + 1;
 
-    if (member_declarations)
+    else if (member_declarations)
         return member_declarations->lastToken();
 
-    if (protocol_refs)
+    else if (protocol_refs)
         return protocol_refs->lastToken();
 
-    if (name)
+    else if (name)
         return name->lastToken();
 
-    for (SpecifierAST *it = attributes; it; it = it->next) {
-        if (! it->next)
-            return it->lastToken();
-    }
+    else if (attributes)
+        return attributes->lastToken();
 
     return protocol_token + 1;
 }
diff --git a/src/shared/cplusplus/AST.h b/src/shared/cplusplus/AST.h
index e4a61e332ba..c8cb6694af2 100644
--- a/src/shared/cplusplus/AST.h
+++ b/src/shared/cplusplus/AST.h
@@ -258,9 +258,6 @@ protected:
 
 class CPLUSPLUS_EXPORT SpecifierAST: public AST
 {
-public:
-    SpecifierAST *next;
-
 public:
     virtual SpecifierAST *asSpecifier() { return this; }
 };
@@ -370,11 +367,11 @@ public:
 class CPLUSPLUS_EXPORT DeclaratorAST: public AST
 {
 public:
-    SpecifierAST *attributes;
+    SpecifierListAST *attributes;
     PtrOperatorListAST *ptr_operators;
     CoreDeclaratorAST *core_declarator;
     PostfixDeclaratorListAST *postfix_declarators;
-    SpecifierAST *post_attributes;
+    SpecifierListAST *post_attributes;
     unsigned equals_token;
     ExpressionAST *initializer;
 
@@ -392,7 +389,7 @@ class CPLUSPLUS_EXPORT SimpleDeclarationAST: public DeclarationAST
 {
 public:
     unsigned qt_invokable_token;
-    SpecifierAST *decl_specifier_seq;
+    SpecifierListAST *decl_specifier_seq;
     DeclaratorListAST *declarators;
     unsigned semicolon_token;
 
@@ -557,7 +554,7 @@ class CPLUSPLUS_EXPORT ClassSpecifierAST: public SpecifierAST
 {
 public:
     unsigned classkey_token;
-    SpecifierAST *attributes;
+    SpecifierListAST *attributes;
     NameAST *name;
     unsigned colon_token;
     BaseSpecifierListAST *base_clause_list;
@@ -619,7 +616,7 @@ protected:
 class CPLUSPLUS_EXPORT ConditionAST: public ExpressionAST
 {
 public:
-    SpecifierAST *type_specifier;
+    SpecifierListAST *type_specifier;
     DeclaratorAST *declarator;
 
 public:
@@ -741,7 +738,7 @@ public:
     unsigned lparen_token;
     ParameterDeclarationClauseAST *parameters;
     unsigned rparen_token;
-    SpecifierAST *cv_qualifier_seq;
+    SpecifierListAST *cv_qualifier_seq;
     ExceptionSpecificationAST *exception_specification;
     ExpressionAST *as_cpp_initializer;
 
@@ -885,7 +882,7 @@ protected:
 class CPLUSPLUS_EXPORT ExceptionDeclarationAST: public DeclarationAST
 {
 public:
-    SpecifierAST *type_specifier;
+    SpecifierListAST *type_specifier;
     DeclaratorAST *declarator;
     unsigned dot_dot_dot_token;
 
@@ -954,7 +951,7 @@ class CPLUSPLUS_EXPORT FunctionDefinitionAST: public DeclarationAST
 {
 public:
     unsigned qt_invokable_token;
-    SpecifierAST *decl_specifier_seq;
+    SpecifierListAST *decl_specifier_seq;
     DeclaratorAST *declarator;
     CtorInitializerAST *ctor_initializer;
     StatementAST *function_body;
@@ -978,7 +975,7 @@ public:
     unsigned foreach_token;
     unsigned lparen_token;
     // declaration
-    SpecifierAST *type_specifiers;
+    SpecifierListAST *type_specifiers;
     DeclaratorAST *declarator;
     // or an expression
     ExpressionAST *initializer;
@@ -1197,7 +1194,7 @@ class CPLUSPLUS_EXPORT ConversionFunctionIdAST: public NameAST
 {
 public:
     unsigned operator_token;
-    SpecifierAST *type_specifier;
+    SpecifierListAST *type_specifier;
     PtrOperatorListAST *ptr_operators;
 
 public:
@@ -1264,7 +1261,7 @@ class CPLUSPLUS_EXPORT NamespaceAST: public DeclarationAST
 public:
     unsigned namespace_token;
     unsigned identifier_token;
-    SpecifierAST *attributes;
+    SpecifierListAST *attributes;
     DeclarationAST *linkage_body;
 
 public: // annotations
@@ -1378,7 +1375,7 @@ protected:
 class CPLUSPLUS_EXPORT NewTypeIdAST: public AST
 {
 public:
-    SpecifierAST *type_specifier;
+    SpecifierListAST *type_specifier;
     PtrOperatorListAST *ptr_operators;
     NewArrayDeclaratorListAST *new_array_declarators;
 
@@ -1412,7 +1409,7 @@ protected:
 class CPLUSPLUS_EXPORT ParameterDeclarationAST: public DeclarationAST
 {
 public:
-    SpecifierAST *type_specifier;
+    SpecifierListAST *type_specifier;
     DeclaratorAST *declarator;
     unsigned equal_token;
     ExpressionAST *expression;
@@ -1558,7 +1555,7 @@ protected:
 class CPLUSPLUS_EXPORT TypeConstructorCallAST: public ExpressionAST
 {
 public:
-    SpecifierAST *type_specifier;
+    SpecifierListAST *type_specifier;
     unsigned lparen_token;
     ExpressionListAST *expression_list;
     unsigned rparen_token;
@@ -1601,7 +1598,7 @@ public:
     unsigned global_scope_token;
     NestedNameSpecifierListAST *nested_name_specifier;
     unsigned star_token;
-    SpecifierAST *cv_qualifier_seq;
+    SpecifierListAST *cv_qualifier_seq;
 
 public:
     virtual PointerToMemberAST *asPointerToMember() { return this; }
@@ -1617,7 +1614,7 @@ class CPLUSPLUS_EXPORT PointerAST: public PtrOperatorAST
 {
 public:
     unsigned star_token;
-    SpecifierAST *cv_qualifier_seq;
+    SpecifierListAST *cv_qualifier_seq;
 
 public:
     virtual PointerAST *asPointer() { return this; }
@@ -1921,7 +1918,7 @@ protected:
 class CPLUSPLUS_EXPORT TypeIdAST: public ExpressionAST
 {
 public:
-    SpecifierAST *type_specifier;
+    SpecifierListAST *type_specifier;
     DeclaratorAST *declarator;
 
 public:
@@ -2063,7 +2060,7 @@ protected:
 class CPLUSPLUS_EXPORT ObjCClassForwardDeclarationAST: public DeclarationAST
 {
 public:
-    SpecifierAST *attributes;
+    SpecifierListAST *attributes;
     unsigned class_token;
     ObjCIdentifierListAST *identifier_list;
     unsigned semicolon_token;
@@ -2084,7 +2081,7 @@ protected:
 class CPLUSPLUS_EXPORT ObjCClassDeclarationAST: public DeclarationAST
 {
 public:
-    SpecifierAST *attributes;
+    SpecifierListAST *attributes;
     unsigned interface_token;
     unsigned implementation_token;
     NameAST *class_name;
@@ -2114,7 +2111,7 @@ protected:
 class CPLUSPLUS_EXPORT ObjCProtocolForwardDeclarationAST: public DeclarationAST
 {
 public:
-    SpecifierAST *attributes;
+    SpecifierListAST *attributes;
     unsigned protocol_token;
     ObjCIdentifierListAST *identifier_list;
     unsigned semicolon_token;
@@ -2135,7 +2132,7 @@ protected:
 class CPLUSPLUS_EXPORT ObjCProtocolDeclarationAST: public DeclarationAST
 {
 public:
-    SpecifierAST *attributes;
+    SpecifierListAST *attributes;
     unsigned protocol_token;
     NameAST *name;
     ObjCProtocolRefsAST *protocol_refs;
@@ -2384,7 +2381,7 @@ protected:
 class CPLUSPLUS_EXPORT ObjCPropertyDeclarationAST: public DeclarationAST
 {
 public:
-    SpecifierAST *attributes;
+    SpecifierListAST *attributes;
     unsigned property_token;
     unsigned lparen_token;
     ObjCPropertyAttributeListAST *property_attributes;
@@ -2405,7 +2402,7 @@ class CPLUSPLUS_EXPORT ObjCMessageArgumentDeclarationAST: public NameAST
 {
 public:
     ObjCTypeNameAST* type_name;
-    SpecifierAST *attributes;
+    SpecifierListAST *attributes;
     unsigned param_name_token;
 
 public: // annotations
@@ -2429,7 +2426,7 @@ public:
     ObjCSelectorAST *selector;
     ObjCMessageArgumentDeclarationListAST *arguments;
     unsigned dot_dot_dot_token;
-    SpecifierAST *attributes;
+    SpecifierListAST *attributes;
 
 public: // annotations
     ObjCMethod *symbol;
@@ -2519,7 +2516,7 @@ public:
     unsigned lparen_token;
 
     // declaration
-    SpecifierAST *type_specifiers;
+    SpecifierListAST *type_specifiers;
     DeclaratorAST *declarator;
     // or an expression
     ExpressionAST *initializer;
diff --git a/src/shared/cplusplus/ASTVisit.cpp b/src/shared/cplusplus/ASTVisit.cpp
index f6d1d9184f8..4e4ee1ffcaf 100644
--- a/src/shared/cplusplus/ASTVisit.cpp
+++ b/src/shared/cplusplus/ASTVisit.cpp
@@ -67,13 +67,11 @@ void TypeofSpecifierAST::accept0(ASTVisitor *visitor)
 void DeclaratorAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        for (SpecifierAST *it = attributes; it; it = it->next)
-            accept(it, visitor);
+        accept(attributes, visitor);
         accept(ptr_operators, visitor);
         accept(core_declarator, visitor);
         accept(postfix_declarators, visitor);
-        for (SpecifierAST *it = post_attributes; it; it = it->next)
-            accept(it, visitor);
+        accept(post_attributes, visitor);
         accept(initializer, visitor);
     }
     visitor->endVisit(this);
@@ -82,10 +80,8 @@ void DeclaratorAST::accept0(ASTVisitor *visitor)
 void SimpleDeclarationAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        for (SpecifierAST *it = decl_specifier_seq; it; it = it->next)
-            accept(it, visitor);
-        for (DeclaratorListAST *it = declarators; it; it = it->next)
-            accept(it, visitor);
+        accept(decl_specifier_seq, visitor);
+        accept(declarators, visitor);
     }
     visitor->endVisit(this);
 }
@@ -157,12 +153,10 @@ void CastExpressionAST::accept0(ASTVisitor *visitor)
 void ClassSpecifierAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        for (SpecifierAST *it = attributes; it; it = it->next)
-            accept(it, visitor);
+        accept(attributes, visitor);
         accept(name, visitor);
         accept(base_clause_list, visitor);
-        for (DeclarationListAST *it = member_specifiers; it; it = it->next)
-            accept(it, visitor);
+        accept(member_specifiers, visitor);
     }
     visitor->endVisit(this);
 }
@@ -188,8 +182,7 @@ void CompoundStatementAST::accept0(ASTVisitor *visitor)
 void ConditionAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        for (SpecifierAST *it = type_specifier; it; it = it->next)
-            accept(it, visitor);
+        accept(type_specifier, visitor);
         accept(declarator, visitor);
     }
     visitor->endVisit(this);
@@ -250,8 +243,7 @@ void FunctionDeclaratorAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
         accept(parameters, visitor);
-        for (SpecifierAST *it = cv_qualifier_seq; it; it = it->next)
-            accept(it, visitor);
+        accept(cv_qualifier_seq, visitor);
         accept(exception_specification, visitor);
         accept(as_cpp_initializer, visitor);
     }
@@ -319,8 +311,7 @@ void EnumeratorAST::accept0(ASTVisitor *visitor)
 void ExceptionDeclarationAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        for (SpecifierAST *it = type_specifier; it; it = it->next)
-            accept(it, visitor);
+        accept(type_specifier, visitor);
         accept(declarator, visitor);
     }
     visitor->endVisit(this);
@@ -355,8 +346,7 @@ void ExpressionStatementAST::accept0(ASTVisitor *visitor)
 void FunctionDefinitionAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        for (SpecifierAST *it = decl_specifier_seq; it; it = it->next)
-            accept(it, visitor);
+        accept(decl_specifier_seq, visitor);
         accept(declarator, visitor);
         accept(ctor_initializer, visitor);
         accept(function_body, visitor);
@@ -367,8 +357,7 @@ void FunctionDefinitionAST::accept0(ASTVisitor *visitor)
 void ForeachStatementAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        for (SpecifierAST *it = type_specifiers; it; it = it->next)
-            accept(it, visitor);
+        accept(type_specifiers, visitor);
         accept(declarator, visitor);
         accept(initializer, visitor);
         accept(expression, visitor);
@@ -469,8 +458,7 @@ void OperatorFunctionIdAST::accept0(ASTVisitor *visitor)
 void ConversionFunctionIdAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        for (SpecifierAST *it = type_specifier; it; it = it->next)
-            accept(it, visitor);
+        accept(type_specifier, visitor);
         accept(ptr_operators, visitor);
     }
     visitor->endVisit(this);
@@ -502,8 +490,7 @@ void TemplateIdAST::accept0(ASTVisitor *visitor)
 void NamespaceAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        for (SpecifierAST *it = attributes; it; it = it->next)
-            accept(it, visitor);
+        accept(attributes, visitor);
         accept(linkage_body, visitor);
     }
     visitor->endVisit(this);
@@ -556,8 +543,7 @@ void NewInitializerAST::accept0(ASTVisitor *visitor)
 void NewTypeIdAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        for (SpecifierAST *it = type_specifier; it; it = it->next)
-            accept(it, visitor);
+        accept(type_specifier, visitor);
         accept(ptr_operators, visitor);
         accept(new_array_declarators, visitor);
     }
@@ -574,8 +560,7 @@ void OperatorAST::accept0(ASTVisitor *visitor)
 void ParameterDeclarationAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        for (SpecifierAST *it = type_specifier; it; it = it->next)
-            accept(it, visitor);
+        accept(type_specifier, visitor);
         accept(declarator, visitor);
         accept(expression, visitor);
     }
@@ -644,10 +629,8 @@ void TypenameCallExpressionAST::accept0(ASTVisitor *visitor)
 void TypeConstructorCallAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        for (SpecifierAST *it = type_specifier; it; it = it->next)
-            accept(it, visitor);
-        for (ExpressionListAST *it = expression_list; it; it = it->next)
-            accept(it, visitor);
+        accept(type_specifier, visitor);
+        accept(expression_list, visitor);
     }
     visitor->endVisit(this);
 }
@@ -665,9 +648,7 @@ void PointerToMemberAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
         accept(nested_name_specifier, visitor);
-
-        for (SpecifierAST *it = cv_qualifier_seq; it; it = it->next)
-            accept(it, visitor);
+        accept(cv_qualifier_seq, visitor);
     }
     visitor->endVisit(this);
 }
@@ -675,8 +656,7 @@ void PointerToMemberAST::accept0(ASTVisitor *visitor)
 void PointerAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        for (SpecifierAST *it = cv_qualifier_seq; it; it = it->next)
-            accept(it, visitor);
+        accept(cv_qualifier_seq, visitor);
     }
     visitor->endVisit(this);
 }
@@ -818,8 +798,7 @@ void CatchClauseAST::accept0(ASTVisitor *visitor)
 void TypeIdAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        for (SpecifierAST *it = type_specifier; it; it = it->next)
-            accept(it, visitor);
+        accept(type_specifier, visitor);
         accept(declarator, visitor);
     }
     visitor->endVisit(this);
@@ -881,10 +860,8 @@ void WhileStatementAST::accept0(ASTVisitor *visitor)
 void ObjCClassForwardDeclarationAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        for (SpecifierAST *it = attributes; it; it = it->next)
-            accept(it, visitor);
-        for (ObjCIdentifierListAST *it = identifier_list; it; it = it->next)
-            accept(it, visitor);
+        accept(attributes, visitor);
+        accept(identifier_list, visitor);
     }
     visitor->endVisit(this);
 }
@@ -892,15 +869,13 @@ void ObjCClassForwardDeclarationAST::accept0(ASTVisitor *visitor)
 void ObjCClassDeclarationAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        for (SpecifierAST *it = attributes; it; it = it->next)
-            accept(it, visitor);
+        accept(attributes, visitor);
         accept(class_name, visitor);
         accept(category_name, visitor);
         accept(superclass, visitor);
         accept(protocol_refs, visitor);
         accept(inst_vars_decl, visitor);
-        for (DeclarationListAST *it = member_declarations; it; it = it->next)
-            accept(it, visitor);
+        accept(member_declarations, visitor);
     }
     visitor->endVisit(this);
 }
@@ -908,10 +883,8 @@ void ObjCClassDeclarationAST::accept0(ASTVisitor *visitor)
 void ObjCProtocolForwardDeclarationAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        for (SpecifierAST *it = attributes; it; it = it->next)
-            accept(it, visitor);
-        for (ObjCIdentifierListAST *it = identifier_list; it; it = it->next)
-            accept(it, visitor);
+        accept(attributes, visitor);
+        accept(identifier_list, visitor);
     }
     visitor->endVisit(this);
 }
@@ -919,12 +892,10 @@ void ObjCProtocolForwardDeclarationAST::accept0(ASTVisitor *visitor)
 void ObjCProtocolDeclarationAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        for (SpecifierAST *it = attributes; it; it = it->next)
-            accept(it, visitor);
+        accept(attributes, visitor);
         accept(name, visitor);
         accept(protocol_refs, visitor);
-        for (DeclarationListAST *it = member_declarations; it; it = it->next)
-            accept(it, visitor);
+        accept(member_declarations, visitor);
     }
     visitor->endVisit(this);
 }
@@ -932,8 +903,7 @@ void ObjCProtocolDeclarationAST::accept0(ASTVisitor *visitor)
 void ObjCProtocolRefsAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        for (ObjCIdentifierListAST *it = identifier_list; it; it = it->next)
-            accept(it, visitor);
+        accept(identifier_list, visitor);
     }
     visitor->endVisit(this);
 }
@@ -1038,10 +1008,8 @@ void ObjCPropertyAttributeAST::accept0(ASTVisitor *visitor)
 void ObjCPropertyDeclarationAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        for (SpecifierAST *it = attributes; it; it = it->next)
-            accept(it, visitor);
-        for (ObjCPropertyAttributeListAST *it = property_attributes; it; it = it->next)
-            accept(it, visitor);
+        accept(attributes, visitor);
+        accept(property_attributes, visitor);
         accept(simple_declaration, visitor);
     }
     visitor->endVisit(this);
@@ -1051,8 +1019,7 @@ void ObjCMessageArgumentDeclarationAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
         accept(type_name, visitor);
-        for (SpecifierAST *it = attributes; it; it = it->next)
-            accept(it, visitor);
+        accept(attributes, visitor);
     }
     visitor->endVisit(this);
 }
@@ -1062,10 +1029,8 @@ void ObjCMethodPrototypeAST::accept0(ASTVisitor *visitor)
     if (visitor->visit(this)) {
         accept(type_name, visitor);
         accept(selector, visitor);
-        for (ObjCMessageArgumentDeclarationListAST *it = arguments; it; it = it->next)
-            accept(it, visitor);
-        for (SpecifierAST *it = attributes; it; it = it->next)
-            accept(it, visitor);
+        accept(arguments, visitor);
+        accept(attributes, visitor);
     }
     visitor->endVisit(this);
 }
@@ -1107,8 +1072,7 @@ void ObjCDynamicPropertiesDeclarationAST::accept0(ASTVisitor *visitor)
 void ObjCFastEnumerationAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        for (SpecifierAST *it = type_specifiers; it; it = it->next)
-            accept(it, visitor);
+        accept(type_specifiers, visitor);
         accept(declarator, visitor);
         accept(initializer, visitor);
         accept(fast_enumeratable_expression, visitor);
diff --git a/src/shared/cplusplus/ASTfwd.h b/src/shared/cplusplus/ASTfwd.h
index 483708356ba..aaeeed94aed 100644
--- a/src/shared/cplusplus/ASTfwd.h
+++ b/src/shared/cplusplus/ASTfwd.h
@@ -205,6 +205,7 @@ typedef List<AttributeAST *> AttributeListAST;
 typedef List<NestedNameSpecifierAST *> NestedNameSpecifierListAST;
 typedef List<CatchClauseAST *> CatchClauseListAST;
 typedef List<PtrOperatorAST *> PtrOperatorListAST;
+typedef List<SpecifierAST *> SpecifierListAST;
 
 typedef List<NameAST *> ObjCIdentifierListAST;
 typedef List<ObjCMessageArgumentAST *> ObjCMessageArgumentListAST;
diff --git a/src/shared/cplusplus/CheckDeclaration.cpp b/src/shared/cplusplus/CheckDeclaration.cpp
index eb67596a35d..c0c570c12e1 100644
--- a/src/shared/cplusplus/CheckDeclaration.cpp
+++ b/src/shared/cplusplus/CheckDeclaration.cpp
@@ -146,7 +146,7 @@ bool CheckDeclaration::visit(SimpleDeclarationAST *ast)
     }
 
     if (! ast->declarators && ast->decl_specifier_seq && ! ast->decl_specifier_seq->next) {
-        if (ElaboratedTypeSpecifierAST *elab_type_spec = ast->decl_specifier_seq->asElaboratedTypeSpecifier()) {
+        if (ElaboratedTypeSpecifierAST *elab_type_spec = ast->decl_specifier_seq->value->asElaboratedTypeSpecifier()) {
 
             unsigned sourceLocation = elab_type_spec->firstToken();
 
diff --git a/src/shared/cplusplus/CheckDeclarator.cpp b/src/shared/cplusplus/CheckDeclarator.cpp
index 0874c1bfa1f..d51aaebd526 100644
--- a/src/shared/cplusplus/CheckDeclarator.cpp
+++ b/src/shared/cplusplus/CheckDeclarator.cpp
@@ -196,9 +196,9 @@ bool CheckDeclarator::visit(FunctionDeclaratorAST *ast)
     FullySpecifiedType funTy(fun);
     _fullySpecifiedType = funTy;
 
-    for (SpecifierAST *it = ast->cv_qualifier_seq; it; it = it->next) {
-        SimpleSpecifierAST *cv = static_cast<SimpleSpecifierAST *>(it);
-        int k = tokenKind(cv->specifier_token);
+    for (SpecifierListAST *it = ast->cv_qualifier_seq; it; it = it->next) {
+        SimpleSpecifierAST *cv = static_cast<SimpleSpecifierAST *>(it->value);
+        const int k = tokenKind(cv->specifier_token);
         if (k == T_CONST)
             fun->setConst(true);
         else if (k == T_VOLATILE)
@@ -278,9 +278,10 @@ bool CheckDeclarator::visit(ObjCMethodPrototypeAST *ast)
     return false;
 }
 
-void CheckDeclarator::applyCvQualifiers(SpecifierAST *cv)
+void CheckDeclarator::applyCvQualifiers(SpecifierListAST *it)
 {
-    for (; cv; cv = cv->next) {
+    for (; it; it = it->next) {
+        SpecifierAST *cv = it->value;
         SimpleSpecifierAST *spec = static_cast<SimpleSpecifierAST *>(cv);
         switch (translationUnit()->tokenKind(spec->specifier_token)) {
         case T_VOLATILE:
diff --git a/src/shared/cplusplus/CheckDeclarator.h b/src/shared/cplusplus/CheckDeclarator.h
index c24d4a5c384..1b9e14cb813 100644
--- a/src/shared/cplusplus/CheckDeclarator.h
+++ b/src/shared/cplusplus/CheckDeclarator.h
@@ -97,7 +97,7 @@ protected:
     virtual bool visit(ObjCMethodPrototypeAST *ast);
 
     void checkMessageArgument(ObjCMessageArgumentDeclarationAST *arg);
-    void applyCvQualifiers(SpecifierAST *cv);
+    void applyCvQualifiers(SpecifierListAST *it);
 
 private:
     DeclaratorAST *_declarator;
diff --git a/src/shared/cplusplus/CheckSpecifier.cpp b/src/shared/cplusplus/CheckSpecifier.cpp
index 0becef32017..3cf51774da8 100644
--- a/src/shared/cplusplus/CheckSpecifier.cpp
+++ b/src/shared/cplusplus/CheckSpecifier.cpp
@@ -69,11 +69,11 @@ CheckSpecifier::CheckSpecifier(Semantic *semantic)
 CheckSpecifier::~CheckSpecifier()
 { }
 
-FullySpecifiedType CheckSpecifier::check(SpecifierAST *specifier, Scope *scope)
+FullySpecifiedType CheckSpecifier::check(SpecifierListAST *specifier, Scope *scope)
 {
     FullySpecifiedType previousType = switchFullySpecifiedType(FullySpecifiedType());
     Scope *previousScope = switchScope(scope);
-    SpecifierAST *previousSpecifier = switchSpecifier(specifier);
+    SpecifierListAST *previousSpecifier = switchSpecifier(specifier);
     accept(specifier);
     (void) switchSpecifier(previousSpecifier);
     (void) switchScope(previousScope);
@@ -91,14 +91,14 @@ FullySpecifiedType CheckSpecifier::check(ObjCTypeNameAST *typeName, Scope *scope
     return switchFullySpecifiedType(previousType);
 }
 
-SpecifierAST *CheckSpecifier::switchSpecifier(SpecifierAST *specifier)
+SpecifierListAST *CheckSpecifier::switchSpecifier(SpecifierListAST *specifier)
 {
-    SpecifierAST *previousSpecifier = _specifier;
+    SpecifierListAST *previousSpecifier = _specifier;
     _specifier = specifier;
     return previousSpecifier;
 }
 
-FullySpecifiedType CheckSpecifier::switchFullySpecifiedType(FullySpecifiedType type)
+FullySpecifiedType CheckSpecifier::switchFullySpecifiedType(const FullySpecifiedType &type)
 {
     FullySpecifiedType previousType = _fullySpecifiedType;
     _fullySpecifiedType = type;
@@ -301,7 +301,7 @@ bool CheckSpecifier::visit(SimpleSpecifierAST *ast)
         default:
             break;
     } // switch
-    accept(ast->next);
+
     return false;
 }
 
@@ -354,7 +354,6 @@ bool CheckSpecifier::visit(ClassSpecifierAST *ast)
     (void) semantic()->switchMethodKey(previousMethodKey);
     (void) semantic()->switchVisibility(previousVisibility);
 
-    accept(ast->next);
     return false;
 }
 
@@ -362,7 +361,6 @@ bool CheckSpecifier::visit(NamedTypeSpecifierAST *ast)
 {
     Name *name = semantic()->check(ast->name, _scope);
     _fullySpecifiedType.setType(control()->namedType(name));
-    accept(ast->next);
     return false;
 }
 
@@ -370,7 +368,6 @@ bool CheckSpecifier::visit(ElaboratedTypeSpecifierAST *ast)
 {
     Name *name = semantic()->check(ast->name, _scope);
     _fullySpecifiedType.setType(control()->namedType(name));
-    accept(ast->next);
     return false;
 }
 
@@ -397,20 +394,17 @@ bool CheckSpecifier::visit(EnumSpecifierAST *ast)
                                                          enumeratorName);
         e->addMember(decl);
     }
-    accept(ast->next);
     return false;
 }
 
 bool CheckSpecifier::visit(TypeofSpecifierAST *ast)
 {
     semantic()->check(ast->expression, _scope);
-    accept(ast->next);
     return false;
 }
 
 bool CheckSpecifier::visit(AttributeSpecifierAST *ast)
 {
-    accept(ast->next);
     return false;
 }
 
diff --git a/src/shared/cplusplus/CheckSpecifier.h b/src/shared/cplusplus/CheckSpecifier.h
index 9f06a437714..4a46d901740 100644
--- a/src/shared/cplusplus/CheckSpecifier.h
+++ b/src/shared/cplusplus/CheckSpecifier.h
@@ -62,12 +62,12 @@ public:
     CheckSpecifier(Semantic *semantic);
     virtual ~CheckSpecifier();
 
-    FullySpecifiedType check(SpecifierAST *specifier, Scope *scope);
+    FullySpecifiedType check(SpecifierListAST *specifier, Scope *scope);
     FullySpecifiedType check(ObjCTypeNameAST *typeName, Scope *scope);
 
 protected:
-    SpecifierAST *switchSpecifier(SpecifierAST *specifier);
-    FullySpecifiedType switchFullySpecifiedType(FullySpecifiedType type);
+    SpecifierListAST *switchSpecifier(SpecifierListAST *specifier);
+    FullySpecifiedType switchFullySpecifiedType(const FullySpecifiedType &type);
     Scope *switchScope(Scope *scope);
 
     using ASTVisitor::visit;
@@ -83,7 +83,7 @@ protected:
     virtual bool visit(ObjCTypeNameAST *ast);
 
 private:
-    SpecifierAST *_specifier;
+    SpecifierListAST *_specifier;
     FullySpecifiedType _fullySpecifiedType;
     Scope *_scope;
 };
diff --git a/src/shared/cplusplus/Parser.cpp b/src/shared/cplusplus/Parser.cpp
index 27de8b6c6a7..5af2ae9a1c6 100644
--- a/src/shared/cplusplus/Parser.cpp
+++ b/src/shared/cplusplus/Parser.cpp
@@ -502,7 +502,7 @@ bool Parser::parseDeclaration(DeclarationAST *&node)
     default: {
         if (_objCEnabled && LA() == T___ATTRIBUTE__) {
             const unsigned start = cursor();
-            SpecifierAST *attributes = 0, **attr = &attributes;
+            SpecifierListAST *attributes = 0, **attr = &attributes;
             while (parseAttributeSpecifier(*attr))
                 attr = &(*attr)->next;
             if (LA() == T_AT_INTERFACE)
@@ -602,7 +602,7 @@ bool Parser::parseNamespace(DeclarationAST *&node)
     ast->namespace_token = namespace_token;
     if (LA() == T_IDENTIFIER)
         ast->identifier_token = consumeToken();
-    SpecifierAST **attr_ptr = &ast->attributes;
+    SpecifierListAST **attr_ptr = &ast->attributes;
     while (LA() == T___ATTRIBUTE__) {
         parseAttributeSpecifier(*attr_ptr);
         attr_ptr = &(*attr_ptr)->next;
@@ -657,7 +657,7 @@ bool Parser::parseConversionFunctionId(NameAST *&node)
     if (LA() != T_OPERATOR)
         return false;
     unsigned operator_token = consumeToken();
-    SpecifierAST *type_specifier = 0;
+    SpecifierListAST *type_specifier = 0;
     if (! parseTypeSpecifier(type_specifier)) {
         return false;
     }
@@ -931,11 +931,13 @@ bool Parser::parseOperator(OperatorAST *&node) // ### FIXME
     return true;
 }
 
-bool Parser::parseCvQualifiers(SpecifierAST *&node)
+bool Parser::parseCvQualifiers(SpecifierListAST *&node)
 {
     DEBUG_THIS_RULE();
+
     unsigned start = cursor();
-    SpecifierAST **ast = &node;
+
+    SpecifierListAST **ast = &node;
     while (*ast)
         ast = &(*ast)->next;
 
@@ -943,7 +945,7 @@ bool Parser::parseCvQualifiers(SpecifierAST *&node)
         if (tk == T_CONST || tk == T_VOLATILE) {
             SimpleSpecifierAST *spec = new (_pool) SimpleSpecifierAST;
             spec->specifier_token = consumeToken();
-            *ast = spec;
+            *ast = new (_pool) SpecifierListAST(spec);
             ast = &(*ast)->next;
         } else if(LA() == T___ATTRIBUTE__) {
             parseAttributeSpecifier(*ast);
@@ -1007,24 +1009,24 @@ bool Parser::parseTemplateArgument(ExpressionAST *&node)
     return parsed;
 }
 
-bool Parser::parseDeclSpecifierSeq(SpecifierAST *&decl_specifier_seq,
+bool Parser::parseDeclSpecifierSeq(SpecifierListAST *&decl_specifier_seq,
                                    bool onlyTypeSpecifiers,
                                    bool simplified)
 {
     DEBUG_THIS_RULE();
     bool has_type_specifier = false;
     NameAST *named_type_specifier = 0;
-    SpecifierAST **decl_specifier_seq_ptr = &decl_specifier_seq;
+    SpecifierListAST **decl_specifier_seq_ptr = &decl_specifier_seq;
     for (;;) {
         if (lookAtCVQualifier()) {
             SimpleSpecifierAST *spec = new (_pool) SimpleSpecifierAST;
             spec->specifier_token = consumeToken();
-            *decl_specifier_seq_ptr = spec;
+            *decl_specifier_seq_ptr = new (_pool) SpecifierListAST(spec);
             decl_specifier_seq_ptr = &(*decl_specifier_seq_ptr)->next;
         } else if (! onlyTypeSpecifiers && lookAtStorageClassSpecifier()) {
             SimpleSpecifierAST *spec = new (_pool) SimpleSpecifierAST;
             spec->specifier_token = consumeToken();
-            *decl_specifier_seq_ptr = spec;
+            *decl_specifier_seq_ptr = new (_pool) SpecifierListAST(spec);
             decl_specifier_seq_ptr = &(*decl_specifier_seq_ptr)->next;
         } else if (! named_type_specifier && lookAtBuiltinTypeSpecifier()) {
             parseBuiltinTypeSpecifier(*decl_specifier_seq_ptr);
@@ -1036,7 +1038,7 @@ bool Parser::parseDeclSpecifierSeq(SpecifierAST *&decl_specifier_seq,
                 return false;
             NamedTypeSpecifierAST *spec = new (_pool) NamedTypeSpecifierAST;
             spec->name = named_type_specifier;
-            *decl_specifier_seq_ptr = spec;
+            *decl_specifier_seq_ptr = new (_pool) SpecifierListAST(spec);
             decl_specifier_seq_ptr = &(*decl_specifier_seq_ptr)->next;
             has_type_specifier = true;
         } else if (! simplified && ! has_type_specifier && (LA() == T_TYPENAME ||
@@ -1075,8 +1077,8 @@ bool Parser::parseCoreDeclarator(DeclaratorAST *&node)
 {
     DEBUG_THIS_RULE();
     unsigned start = cursor();
-    SpecifierAST *attributes = 0;
-    SpecifierAST **attribute_ptr = &attributes;
+    SpecifierListAST *attributes = 0;
+    SpecifierListAST **attribute_ptr = &attributes;
     while (LA() == T___ATTRIBUTE__) {
         parseAttributeSpecifier(*attribute_ptr);
         attribute_ptr = &(*attribute_ptr)->next;
@@ -1207,7 +1209,7 @@ bool Parser::parseDeclarator(DeclaratorAST *&node, bool stopAtCppInitializer)
             consumeToken(); // skip T_RPAREN
     }
 
-    SpecifierAST **spec_ptr = &node->post_attributes;
+    SpecifierListAST **spec_ptr = &node->post_attributes;
     while (LA() == T___ATTRIBUTE__) {
         parseAttributeSpecifier(*spec_ptr);
         spec_ptr = &(*spec_ptr)->next;
@@ -1296,7 +1298,7 @@ bool Parser::parseAbstractDeclarator(DeclaratorAST *&node)
     return true;
 }
 
-bool Parser::parseEnumSpecifier(SpecifierAST *&node)
+bool Parser::parseEnumSpecifier(SpecifierListAST *&node)
 {
     DEBUG_THIS_RULE();
     if (LA() == T_ENUM) {
@@ -1327,7 +1329,7 @@ bool Parser::parseEnumSpecifier(SpecifierAST *&node)
                     match(T_COMMA, &comma_token);
             }
             match(T_RBRACE, &ast->rbrace_token);
-            node = ast;
+            node = new (_pool) SpecifierListAST(ast);
             return true;
         }
     }
@@ -1428,7 +1430,7 @@ bool Parser::parseTypeParameter(DeclarationAST *&node)
 bool Parser::parseTypeId(ExpressionAST *&node)
 {
     DEBUG_THIS_RULE();
-    SpecifierAST *type_specifier = 0;
+    SpecifierListAST *type_specifier = 0;
     if (parseTypeSpecifier(type_specifier)) {
         TypeIdAST *ast = new (_pool) TypeIdAST;
         ast->type_specifier = type_specifier;
@@ -1504,7 +1506,7 @@ bool Parser::parseParameterDeclarationList(DeclarationListAST *&node)
 bool Parser::parseParameterDeclaration(DeclarationAST *&node)
 {
     DEBUG_THIS_RULE();
-    SpecifierAST *decl_specifier_seq = 0;
+    SpecifierListAST *decl_specifier_seq = 0;
     if (parseDeclSpecifierSeq(decl_specifier_seq)) {
         ParameterDeclarationAST *ast = new (_pool) ParameterDeclarationAST;
         ast->type_specifier = decl_specifier_seq;
@@ -1520,7 +1522,7 @@ bool Parser::parseParameterDeclaration(DeclarationAST *&node)
     return false;
 }
 
-bool Parser::parseClassSpecifier(SpecifierAST *&node)
+bool Parser::parseClassSpecifier(SpecifierListAST *&node)
 {
     DEBUG_THIS_RULE();
     if (! lookAtClassKey())
@@ -1528,7 +1530,7 @@ bool Parser::parseClassSpecifier(SpecifierAST *&node)
 
     unsigned classkey_token = consumeToken();
 
-    SpecifierAST *attributes = 0, **attr_ptr = &attributes;
+    SpecifierListAST *attributes = 0, **attr_ptr = &attributes;
     while (LA() == T___ATTRIBUTE__) {
         parseAttributeSpecifier(*attr_ptr);
         attr_ptr = &(*attr_ptr)->next;
@@ -1601,7 +1603,7 @@ bool Parser::parseClassSpecifier(SpecifierAST *&node)
                 skipUntilDeclaration();
             }
         }
-        node = ast;
+        node = new (_pool) SpecifierListAST(ast);
         parsed = true;
     }
 
@@ -1684,19 +1686,17 @@ bool Parser::parseCtorInitializer(CtorInitializerAST *&node)
     return false;
 }
 
-bool Parser::parseElaboratedTypeSpecifier(SpecifierAST *&node)
+bool Parser::parseElaboratedTypeSpecifier(SpecifierListAST *&node)
 {
     DEBUG_THIS_RULE();
     if (lookAtClassKey() || LA() == T_ENUM || LA() == T_TYPENAME) {
         unsigned classkey_token = consumeToken();
         NameAST *name = 0;
         if (parseName(name)) {
-            ElaboratedTypeSpecifierAST *ast =
-                    new (_pool) ElaboratedTypeSpecifierAST;
-
+            ElaboratedTypeSpecifierAST *ast = new (_pool) ElaboratedTypeSpecifierAST;
             ast->classkey_token = classkey_token;
             ast->name = name;
-            node = ast;
+            node = new (_pool) SpecifierListAST(ast);
             return true;
         }
     }
@@ -2169,8 +2169,8 @@ bool Parser::isPointerDeclaration(DeclarationStatementAST *ast) const
         return false;
 
     if (SimpleDeclarationAST *declaration = ast->declaration->asSimpleDeclaration()) {
-        if (SpecifierAST *spec = declaration->decl_specifier_seq) {
-            if (spec->asNamedTypeSpecifier() && ! spec->next) {
+        if (SpecifierListAST *spec = declaration->decl_specifier_seq) {
+            if (spec->value->asNamedTypeSpecifier() && ! spec->next) {
                 if (DeclaratorListAST *declarators = declaration->declarators) {
                     if (DeclaratorAST *declarator = declarators->value) {
                         if (declarator->ptr_operators && declarator->equals_token && declarator->initializer) {
@@ -2191,8 +2191,8 @@ bool Parser::maybeAmbiguousStatement(DeclarationStatementAST *ast) const
         return false;
 
     if (SimpleDeclarationAST *declaration = ast->declaration->asSimpleDeclaration()) {
-        if (SpecifierAST *spec = declaration->decl_specifier_seq) {
-            if (spec->asNamedTypeSpecifier() && ! spec->next) {
+        if (SpecifierListAST *spec = declaration->decl_specifier_seq) {
+            if (spec->value->asNamedTypeSpecifier() && ! spec->next) {
                 if (DeclaratorListAST *declarators = declaration->declarators) {
                     if (DeclaratorAST *declarator = declarators->value) {
                         if (declarator->core_declarator &&
@@ -2268,7 +2268,7 @@ bool Parser::parseCondition(ExpressionAST *&node)
     unsigned start = cursor();
 
     bool blocked = blockErrors(true);
-    SpecifierAST *type_specifier = 0;
+    SpecifierListAST *type_specifier = 0;
     if (parseTypeSpecifier(type_specifier)) {
         DeclaratorAST *declarator = 0;
         if (parseInitDeclarator(declarator, /*acceptStructDeclarator=*/false)) {
@@ -2673,7 +2673,7 @@ bool Parser::lookAtClassKey() const
     }
 }
 
-bool Parser::parseAttributeSpecifier(SpecifierAST *&node)
+bool Parser::parseAttributeSpecifier(SpecifierListAST *&node)
 {
     DEBUG_THIS_RULE();
     if (LA() != T___ATTRIBUTE__)
@@ -2686,7 +2686,7 @@ bool Parser::parseAttributeSpecifier(SpecifierAST *&node)
     parseAttributeList(ast->attributes);
     match(T_RPAREN, &ast->first_rparen_token);
     match(T_RPAREN, &ast->second_rparen_token);
-    node = ast;
+    node = new (_pool) SpecifierListAST(ast);
     return true;
 }
 
@@ -2711,7 +2711,7 @@ bool Parser::parseAttributeList(AttributeListAST *&node) // ### create the AST
     return true;
 }
 
-bool Parser::parseBuiltinTypeSpecifier(SpecifierAST *&node)
+bool Parser::parseBuiltinTypeSpecifier(SpecifierListAST *&node)
 {
     DEBUG_THIS_RULE();
     if (LA() == T___ATTRIBUTE__) {
@@ -2724,18 +2724,18 @@ bool Parser::parseBuiltinTypeSpecifier(SpecifierAST *&node)
             if (parseTypeId(ast->expression) && LA() == T_RPAREN) {
                 ast->lparen_token = lparen_token;
                 ast->rparen_token = consumeToken();
-                node = ast;
+                node = new (_pool) SpecifierListAST(ast);
                 return true;
             }
             rewind(lparen_token);
         }
         parseUnaryExpression(ast->expression);
-        node = ast;
+        node = new (_pool) SpecifierListAST(ast);
         return true;
     } else if (lookAtBuiltinTypeSpecifier()) {
         SimpleSpecifierAST *ast = new (_pool) SimpleSpecifierAST;
         ast->specifier_token = consumeToken();
-        node = ast;
+        node = new (_pool) SpecifierListAST(ast);
         return true;
     }
     return false;
@@ -2755,14 +2755,14 @@ bool Parser::parseSimpleDeclaration(DeclarationAST *&node,
     bool has_complex_type_specifier = false;
     unsigned startOfNamedTypeSpecifier = 0;
     NameAST *named_type_specifier = 0;
-    SpecifierAST *decl_specifier_seq = 0,
+    SpecifierListAST *decl_specifier_seq = 0,
          **decl_specifier_seq_ptr = &decl_specifier_seq;
     for (;;) {
         if (lookAtCVQualifier() || lookAtFunctionSpecifier()
                 || lookAtStorageClassSpecifier()) {
             SimpleSpecifierAST *spec = new (_pool) SimpleSpecifierAST;
             spec->specifier_token = consumeToken();
-            *decl_specifier_seq_ptr = spec;
+            *decl_specifier_seq_ptr = new (_pool) SpecifierListAST(spec);
             decl_specifier_seq_ptr = &(*decl_specifier_seq_ptr)->next;
         } else if (LA() == T___ATTRIBUTE__) {
             parseAttributeSpecifier(*decl_specifier_seq_ptr);
@@ -2777,7 +2777,7 @@ bool Parser::parseSimpleDeclaration(DeclarationAST *&node,
             if (parseName(named_type_specifier)) {
                 NamedTypeSpecifierAST *spec = new (_pool) NamedTypeSpecifierAST;
                 spec->name = named_type_specifier;
-                *decl_specifier_seq_ptr = spec;
+                *decl_specifier_seq_ptr = new (_pool) SpecifierListAST(spec);
                 decl_specifier_seq_ptr = &(*decl_specifier_seq_ptr)->next;
                 has_type_specifier = true;
             } else {
@@ -2834,7 +2834,7 @@ bool Parser::parseSimpleDeclaration(DeclarationAST *&node,
         rewind(startOfNamedTypeSpecifier);
         named_type_specifier = 0;
         // pop the named type specifier from the decl-specifier-seq
-        SpecifierAST **spec_ptr = &decl_specifier_seq;
+        SpecifierListAST **spec_ptr = &decl_specifier_seq;
         for (; *spec_ptr; spec_ptr = &(*spec_ptr)->next) {
             if (! (*spec_ptr)->next) {
                 *spec_ptr = 0;
@@ -2907,13 +2907,13 @@ bool Parser::parseSimpleDeclaration(DeclarationAST *&node,
     return false;
 }
 
-bool Parser::maybeForwardOrClassDeclaration(SpecifierAST *decl_specifier_seq) const
+bool Parser::maybeForwardOrClassDeclaration(SpecifierListAST *decl_specifier_seq) const
 {
     // look at the decl_specifier for possible fwd or class declarations.
-    if (SpecifierAST *spec = decl_specifier_seq) {
-        if (! spec->next && (spec->asElaboratedTypeSpecifier() ||
-                             spec->asEnumSpecifier() ||
-                             spec->asClassSpecifier()))
+    if (SpecifierListAST *spec = decl_specifier_seq) {
+        if (! spec->next && (spec->value->asElaboratedTypeSpecifier() ||
+                             spec->value->asEnumSpecifier() ||
+                             spec->value->asClassSpecifier()))
             return true;
     }
 
@@ -2985,7 +2985,7 @@ bool Parser::parseExceptionDeclaration(ExceptionDeclarationAST *&node)
         return true;
     }
 
-    SpecifierAST *type_specifier = 0;
+    SpecifierListAST *type_specifier = 0;
     if (parseTypeSpecifier(type_specifier)) {
         ExceptionDeclarationAST *ast = new (_pool) ExceptionDeclarationAST;
         ast->type_specifier = type_specifier;
@@ -3539,7 +3539,7 @@ bool Parser::parseCorePostfixExpression(ExpressionAST *&node)
 
     default: {
         unsigned start = cursor();
-        SpecifierAST *type_specifier = 0;
+        SpecifierListAST *type_specifier = 0;
         bool blocked = blockErrors(true);
         if (lookAtBuiltinTypeSpecifier() &&
                 parseSimpleTypeSpecifier(type_specifier) &&
@@ -3794,7 +3794,7 @@ bool Parser::parseNewExpression(ExpressionAST *&node)
 bool Parser::parseNewTypeId(NewTypeIdAST *&node)
 {
     DEBUG_THIS_RULE();
-    SpecifierAST *typeSpec = 0;
+    SpecifierListAST *typeSpec = 0;
     if (! parseTypeSpecifier(typeSpec))
         return false;
 
@@ -4346,11 +4346,11 @@ bool Parser::parseObjCClassForwardDeclaration(DeclarationAST *&node)
 //                             T_AT_END
 //
 bool Parser::parseObjCInterface(DeclarationAST *&node,
-                                SpecifierAST *attributes)
+                                SpecifierListAST *attributes)
 {
     DEBUG_THIS_RULE();
     if (! attributes && LA() == T___ATTRIBUTE__) {
-        SpecifierAST **attr = &attributes;
+        SpecifierListAST **attr = &attributes;
         while (parseAttributeSpecifier(*attr))
             attr = &(*attr)->next;
     }
@@ -4436,11 +4436,11 @@ bool Parser::parseObjCInterface(DeclarationAST *&node,
 // objc-protocol ::= T_AT_PROTOCOL (T_IDENTIFIER @ T_COMMA) T_SEMICOLON
 //
 bool Parser::parseObjCProtocol(DeclarationAST *&node,
-                               SpecifierAST *attributes)
+                               SpecifierListAST *attributes)
 {
     DEBUG_THIS_RULE();
     if (! attributes && LA() == T___ATTRIBUTE__) {
-        SpecifierAST **attr = &attributes;
+        SpecifierListAST **attr = &attributes;
         while (parseAttributeSpecifier(*attr))
             attr = &(*attr)->next;
     }
@@ -4840,7 +4840,7 @@ bool Parser::parseObjCInstanceVariableDeclaration(DeclarationAST *&node)
 // objc-property-declaration ::=
 //    T_AT_PROPERTY T_LPAREN (property-attribute @ T_COMMA) T_RPAREN simple-declaration
 //
-bool Parser::parseObjCPropertyDeclaration(DeclarationAST *&node, SpecifierAST *attributes)
+bool Parser::parseObjCPropertyDeclaration(DeclarationAST *&node, SpecifierListAST *attributes)
 {
     DEBUG_THIS_RULE();
     if (LA() != T_AT_PROPERTY)
@@ -4943,7 +4943,7 @@ bool Parser::parseObjCMethodPrototype(ObjCMethodPrototypeAST *&node)
         _translationUnit->error(cursor(), "expected a selector");
     }
 
-    SpecifierAST **attr = &(ast->attributes);
+    SpecifierListAST **attr = &ast->attributes;
     while (parseAttributeSpecifier(*attr))
         attr = &(*attr)->next;
 
@@ -5050,7 +5050,7 @@ bool Parser::parseObjCKeywordDeclaration(ObjCSelectorArgumentAST *&argument, Obj
 
     parseObjCTypeName(node->type_name);
 
-    SpecifierAST **attr = &(node->attributes);
+    SpecifierListAST **attr = &node->attributes;
     while (parseAttributeSpecifier(*attr))
         attr = &(*attr)->next;
 
diff --git a/src/shared/cplusplus/Parser.h b/src/shared/cplusplus/Parser.h
index 6ac28e58a7b..ba0785e7eab 100644
--- a/src/shared/cplusplus/Parser.h
+++ b/src/shared/cplusplus/Parser.h
@@ -89,7 +89,7 @@ public:
     bool parseBlockDeclaration(DeclarationAST *&node);
     bool parseCppCastExpression(ExpressionAST *&node);
     bool parseCastExpression(ExpressionAST *&node);
-    bool parseClassSpecifier(SpecifierAST *&node);
+    bool parseClassSpecifier(SpecifierListAST *&node);
     bool parseCommaExpression(ExpressionAST *&node);
     bool parseCompoundStatement(StatementAST *&node);
     bool parseBreakStatement(StatementAST *&node);
@@ -100,7 +100,7 @@ public:
     bool parseConditionalExpression(ExpressionAST *&node);
     bool parseConstantExpression(ExpressionAST *&node);
     bool parseCtorInitializer(CtorInitializerAST *&node);
-    bool parseCvQualifiers(SpecifierAST *&node);
+    bool parseCvQualifiers(SpecifierListAST *&node);
     bool parseDeclaratorOrAbstractDeclarator(DeclaratorAST *&node);
     bool parseDeclaration(DeclarationAST *&node);
     bool parseSimpleDeclaration(DeclarationAST *&node, bool acceptStructDeclarator = false);
@@ -109,8 +109,8 @@ public:
     bool parseDeclarator(DeclaratorAST *&node, bool stopAtCppInitializer = false);
     bool parseDeleteExpression(ExpressionAST *&node);
     bool parseDoStatement(StatementAST *&node);
-    bool parseElaboratedTypeSpecifier(SpecifierAST *&node);
-    bool parseEnumSpecifier(SpecifierAST *&node);
+    bool parseElaboratedTypeSpecifier(SpecifierListAST *&node);
+    bool parseEnumSpecifier(SpecifierListAST *&node);
     bool parseEnumerator(EnumeratorListAST *&node);
     bool parseEqualityExpression(ExpressionAST *&node);
     bool parseExceptionDeclaration(ExceptionDeclarationAST *&node);
@@ -188,17 +188,17 @@ public:
     bool parseTemplateTypeParameter(DeclarationAST *&node);
     bool parseTypeParameter(DeclarationAST *&node);
 
-    bool parseBuiltinTypeSpecifier(SpecifierAST *&node);
-    bool parseAttributeSpecifier(SpecifierAST *&node);
+    bool parseBuiltinTypeSpecifier(SpecifierListAST *&node);
+    bool parseAttributeSpecifier(SpecifierListAST *&node);
     bool parseAttributeList(AttributeListAST *&node);
 
-    bool parseSimpleTypeSpecifier(SpecifierAST *&node)
+    bool parseSimpleTypeSpecifier(SpecifierListAST *&node)
     { return parseDeclSpecifierSeq(node, true, true); }
 
-    bool parseTypeSpecifier(SpecifierAST *&node)
+    bool parseTypeSpecifier(SpecifierListAST *&node)
     { return parseDeclSpecifierSeq(node, true); }
 
-    bool parseDeclSpecifierSeq(SpecifierAST *&node,
+    bool parseDeclSpecifierSeq(SpecifierListAST *&node,
                                bool onlyTypeSpecifiers = false,
                                bool simplified = false);
     bool parseUnaryExpression(ExpressionAST *&node);
@@ -214,9 +214,9 @@ public:
     bool parseObjCExpression(ExpressionAST *&node);
     bool parseObjCClassForwardDeclaration(DeclarationAST *&node);
     bool parseObjCInterface(DeclarationAST *&node,
-                            SpecifierAST *attributes = 0);
+                            SpecifierListAST *attributes = 0);
     bool parseObjCProtocol(DeclarationAST *&node,
-                           SpecifierAST *attributes = 0);
+                           SpecifierListAST *attributes = 0);
 
     bool parseObjCSynchronizedStatement(StatementAST *&node);
     bool parseObjCEncodeExpression(ExpressionAST *&node);
@@ -236,7 +236,7 @@ public:
     bool parseObjCInterfaceMemberDeclaration(DeclarationAST *&node);
     bool parseObjCInstanceVariableDeclaration(DeclarationAST *&node);
     bool parseObjCPropertyDeclaration(DeclarationAST *&node,
-                                      SpecifierAST *attributes = 0);
+                                      SpecifierListAST *attributes = 0);
     bool parseObjCImplementation(DeclarationAST *&node);
     bool parseObjCMethodPrototype(ObjCMethodPrototypeAST *&node);
     bool parseObjCPropertyAttribute(ObjCPropertyAttributeAST *&node);
@@ -264,7 +264,7 @@ public:
     void match(int kind, unsigned *token);
 
     bool maybeAmbiguousStatement(DeclarationStatementAST *ast) const;
-    bool maybeForwardOrClassDeclaration(SpecifierAST *decl_specifier_seq) const;
+    bool maybeForwardOrClassDeclaration(SpecifierListAST *decl_specifier_seq) const;
     bool isPointerDeclaration(DeclarationStatementAST *ast) const;
 
 private:
diff --git a/src/shared/cplusplus/Semantic.cpp b/src/shared/cplusplus/Semantic.cpp
index 8c01a3ee800..134e6c594a1 100644
--- a/src/shared/cplusplus/Semantic.cpp
+++ b/src/shared/cplusplus/Semantic.cpp
@@ -120,7 +120,7 @@ Semantic::~Semantic()
 Control *Semantic::control() const
 { return d->control; }
 
-FullySpecifiedType Semantic::check(SpecifierAST *specifier, Scope *scope)
+FullySpecifiedType Semantic::check(SpecifierListAST *specifier, Scope *scope)
 { return d->checkSpecifier->check(specifier, scope); }
 
 void Semantic::check(DeclarationAST *declaration, Scope *scope, TemplateParameters *templateParameters)
diff --git a/src/shared/cplusplus/Semantic.h b/src/shared/cplusplus/Semantic.h
index 3e2d8c4bacc..391872d8470 100644
--- a/src/shared/cplusplus/Semantic.h
+++ b/src/shared/cplusplus/Semantic.h
@@ -66,7 +66,7 @@ public:
 
     Control *control() const;
 
-    FullySpecifiedType check(SpecifierAST *specifier, Scope *scope);
+    FullySpecifiedType check(SpecifierListAST *specifier, Scope *scope);
 
     FullySpecifiedType check(DeclaratorAST *declarator, FullySpecifiedType type,
                              Scope *scope, Name **name = 0); // ### ugly
diff --git a/tests/auto/cplusplus/ast/tst_ast.cpp b/tests/auto/cplusplus/ast/tst_ast.cpp
index e2fe27e8e5f..b2e583a3d80 100644
--- a/tests/auto/cplusplus/ast/tst_ast.cpp
+++ b/tests/auto/cplusplus/ast/tst_ast.cpp
@@ -397,8 +397,8 @@ void tst_AST::while_condition_statement()
     ConditionAST *condition = stmt->condition->asCondition();
     QVERIFY(condition != 0);
     QVERIFY(condition->type_specifier != 0);
-    QVERIFY(condition->type_specifier->asSimpleSpecifier() != 0);
-    QCOMPARE(condition->type_specifier->asSimpleSpecifier()->specifier_token, 3U);
+    QVERIFY(condition->type_specifier->value->asSimpleSpecifier() != 0);
+    QCOMPARE(condition->type_specifier->value->asSimpleSpecifier()->specifier_token, 3U);
     QVERIFY(condition->type_specifier->next == 0);
     QVERIFY(condition->declarator != 0);
     QVERIFY(condition->declarator->core_declarator != 0);
@@ -463,7 +463,7 @@ void tst_AST::cpp_initializer_or_function_declaration()
     QVERIFY(simple_decl->declarators->next == 0);
     QCOMPARE(simple_decl->semicolon_token, 6U);
 
-    NamedTypeSpecifierAST *named_ty = simple_decl->decl_specifier_seq->asNamedTypeSpecifier();
+    NamedTypeSpecifierAST *named_ty = simple_decl->decl_specifier_seq->value->asNamedTypeSpecifier();
     QVERIFY(named_ty != 0);
     QVERIFY(named_ty->name != 0);
 
@@ -506,10 +506,10 @@ void tst_AST::cpp_initializer_or_function_declaration()
     QVERIFY(param);
     QVERIFY(param->type_specifier != 0);
     QVERIFY(param->type_specifier->next == 0);
-    QVERIFY(param->type_specifier->asNamedTypeSpecifier() != 0);
-    QVERIFY(param->type_specifier->asNamedTypeSpecifier()->name != 0);
-    QVERIFY(param->type_specifier->asNamedTypeSpecifier()->name->asSimpleName() != 0);
-    QCOMPARE(param->type_specifier->asNamedTypeSpecifier()->name->asSimpleName()->identifier_token, 4U);
+    QVERIFY(param->type_specifier->value->asNamedTypeSpecifier() != 0);
+    QVERIFY(param->type_specifier->value->asNamedTypeSpecifier()->name != 0);
+    QVERIFY(param->type_specifier->value->asNamedTypeSpecifier()->name->asSimpleName() != 0);
+    QCOMPARE(param->type_specifier->value->asNamedTypeSpecifier()->name->asSimpleName()->identifier_token, 4U);
 }
 
 void tst_AST::objc_attributes_followed_by_at_keyword()
@@ -655,7 +655,7 @@ void tst_AST::objc_msg_send_expression()
 
         {// check the type (NSObject)
             QVERIFY(simpleDecl->decl_specifier_seq && !simpleDecl->decl_specifier_seq->next);
-            NamedTypeSpecifierAST *namedType = simpleDecl->decl_specifier_seq->asNamedTypeSpecifier();
+            NamedTypeSpecifierAST *namedType = simpleDecl->decl_specifier_seq->value->asNamedTypeSpecifier();
             QVERIFY(namedType && namedType->name);
             SimpleNameAST *typeName = namedType->name->asSimpleName();
             QVERIFY(typeName);
-- 
GitLab