summaryrefslogtreecommitdiff
path: root/src/shared/cplusplus
diff options
context:
space:
mode:
Diffstat (limited to 'src/shared/cplusplus')
-rw-r--r--src/shared/cplusplus/AST.cpp2
-rw-r--r--src/shared/cplusplus/AST.h2
-rw-r--r--src/shared/cplusplus/ASTClone.cpp3
-rw-r--r--src/shared/cplusplus/ASTMatcher.cpp5
-rw-r--r--src/shared/cplusplus/ASTVisit.cpp1
5 files changed, 13 insertions, 0 deletions
diff --git a/src/shared/cplusplus/AST.cpp b/src/shared/cplusplus/AST.cpp
index d5b605116d..785b8178d4 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 f0bbb04314..11f038db5a 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 011d6ec230..586d88e21a 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 3fe3a8d410..42cbadcbdb 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 4c0a2e98d4..8216f87b48 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);