From 7a3fbf120a48b02e23057ea681f9c7df9af3dd93 Mon Sep 17 00:00:00 2001
From: Erik Verbruggen <erik.verbruggen@nokia.com>
Date: Mon, 22 Mar 2010 18:23:17 +0100
Subject: [PATCH] Added attributes to the elaborate-type-specifier AST node.

---
 src/shared/cplusplus/AST.cpp        | 2 ++
 src/shared/cplusplus/AST.h          | 2 ++
 src/shared/cplusplus/ASTClone.cpp   | 3 +++
 src/shared/cplusplus/ASTMatcher.cpp | 5 +++++
 src/shared/cplusplus/ASTVisit.cpp   | 1 +
 5 files changed, 13 insertions(+)

diff --git a/src/shared/cplusplus/AST.cpp b/src/shared/cplusplus/AST.cpp
index d5b605116dc..785b8178d44 100644
--- a/src/shared/cplusplus/AST.cpp
+++ b/src/shared/cplusplus/AST.cpp
@@ -834,6 +834,8 @@ unsigned ElaboratedTypeSpecifierAST::lastToken() const
 {
     if (name)
         return name->lastToken();
+    if (attribute_list)
+        return attribute_list->lastToken();
     return classkey_token + 1;
 }
 
diff --git a/src/shared/cplusplus/AST.h b/src/shared/cplusplus/AST.h
index f0bbb04314b..11f038db5a6 100644
--- a/src/shared/cplusplus/AST.h
+++ b/src/shared/cplusplus/AST.h
@@ -1559,11 +1559,13 @@ class CPLUSPLUS_EXPORT ElaboratedTypeSpecifierAST: public SpecifierAST
 {
 public:
     unsigned classkey_token;
+    SpecifierListAST *attribute_list;
     NameAST *name;
 
 public:
     ElaboratedTypeSpecifierAST()
         : classkey_token(0)
+        , attribute_list(0)
         , name(0)
     {}
 
diff --git a/src/shared/cplusplus/ASTClone.cpp b/src/shared/cplusplus/ASTClone.cpp
index 011d6ec230f..586d88e21a7 100644
--- a/src/shared/cplusplus/ASTClone.cpp
+++ b/src/shared/cplusplus/ASTClone.cpp
@@ -528,6 +528,9 @@ ElaboratedTypeSpecifierAST *ElaboratedTypeSpecifierAST::clone(MemoryPool *pool)
 {
     ElaboratedTypeSpecifierAST *ast = new (pool) ElaboratedTypeSpecifierAST;
     ast->classkey_token = classkey_token;
+    for (SpecifierListAST *iter = attribute_list, **ast_iter = &ast->attribute_list;
+         iter; iter = iter->next, ast_iter = &(*ast_iter)->next)
+        *ast_iter = new (pool) SpecifierListAST((iter->value) ? iter->value->clone(pool) : 0);
     if (name)
         ast->name = name->clone(pool);
     return ast;
diff --git a/src/shared/cplusplus/ASTMatcher.cpp b/src/shared/cplusplus/ASTMatcher.cpp
index 3fe3a8d410c..42cbadcbdbf 100644
--- a/src/shared/cplusplus/ASTMatcher.cpp
+++ b/src/shared/cplusplus/ASTMatcher.cpp
@@ -874,6 +874,11 @@ bool ASTMatcher::match(ElaboratedTypeSpecifierAST *node, ElaboratedTypeSpecifier
 
     pattern->classkey_token = node->classkey_token;
 
+    if (! pattern->attribute_list)
+        pattern->attribute_list = node->attribute_list;
+    else if (! AST::match(node->attribute_list, pattern->attribute_list, this))
+        return false;
+
     if (! pattern->name)
         pattern->name = node->name;
     else if (! AST::match(node->name, pattern->name, this))
diff --git a/src/shared/cplusplus/ASTVisit.cpp b/src/shared/cplusplus/ASTVisit.cpp
index 4c0a2e98d47..8216f87b488 100644
--- a/src/shared/cplusplus/ASTVisit.cpp
+++ b/src/shared/cplusplus/ASTVisit.cpp
@@ -391,6 +391,7 @@ void NamedTypeSpecifierAST::accept0(ASTVisitor *visitor)
 void ElaboratedTypeSpecifierAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
+        accept(attribute_list, visitor);
         accept(name, visitor);
     }
     visitor->endVisit(this);
-- 
GitLab