summaryrefslogtreecommitdiff
path: root/src/shared/cplusplus
diff options
context:
space:
mode:
authorRoberto Raggi <roberto.raggi@nokia.com>2010-03-19 11:08:58 +0100
committerRoberto Raggi <roberto.raggi@nokia.com>2010-03-19 11:09:35 +0100
commit273a64bbeb3bd542ee4405e8c8167a9283cbc5b9 (patch)
tree1a33545ac05495ec3ed288299bdeb6e10a440ce3 /src/shared/cplusplus
parentd20fd0c8d8e69882f2ad9435fe353711086a402d (diff)
downloadqt-creator-273a64bbeb3bd542ee4405e8c8167a9283cbc5b9.tar.gz
Fixed possible leaks when processing friend template classes and template constructors.
Diffstat (limited to 'src/shared/cplusplus')
-rw-r--r--src/shared/cplusplus/CheckDeclaration.cpp19
1 files changed, 12 insertions, 7 deletions
diff --git a/src/shared/cplusplus/CheckDeclaration.cpp b/src/shared/cplusplus/CheckDeclaration.cpp
index 828ec6d381..a53161245c 100644
--- a/src/shared/cplusplus/CheckDeclaration.cpp
+++ b/src/shared/cplusplus/CheckDeclaration.cpp
@@ -144,16 +144,20 @@ bool CheckDeclaration::visit(SimpleDeclarationAST *ast)
if (_templateParameters && ty) {
if (Class *klass = ty->asClassType()) {
klass->setTemplateParameters(_templateParameters);
+ _templateParameters = 0; // consume the template parameters
}
}
- if (! ast->declarator_list && ast->decl_specifier_list && ! ast->decl_specifier_list->next) {
- if (ElaboratedTypeSpecifierAST *elab_type_spec = ast->decl_specifier_list->value->asElaboratedTypeSpecifier()) {
+ if (ast->decl_specifier_list && ! ast->declarator_list) {
+ ElaboratedTypeSpecifierAST *elab_type_spec = ast->decl_specifier_list->value->asElaboratedTypeSpecifier();
- unsigned sourceLocation = elab_type_spec->firstToken();
+ if (! elab_type_spec && ty.isFriend() && ast->decl_specifier_list->next && ! ast->decl_specifier_list->next->next) {
+ // friend template class
+ elab_type_spec = ast->decl_specifier_list->next->value->asElaboratedTypeSpecifier();
+ }
- if (elab_type_spec->name)
- sourceLocation = elab_type_spec->name->firstToken();
+ if (elab_type_spec) {
+ unsigned sourceLocation = ast->decl_specifier_list->firstToken();
const Name *name = semantic()->check(elab_type_spec->name, _scope);
ForwardClassDeclaration *symbol =
@@ -210,11 +214,12 @@ bool CheckDeclaration::visit(SimpleDeclarationAST *ast)
symbol->setStartOffset(tokenAt(ast->firstToken()).offset);
symbol->setEndOffset(tokenAt(ast->lastToken()).offset);
- symbol->setType(control()->integerType(IntegerType::Int));
symbol->setType(declTy);
- if (_templateParameters && it == ast->declarator_list && ty && ! ty->isClassType())
+ if (_templateParameters && it == ast->declarator_list) {
symbol->setTemplateParameters(_templateParameters);
+ _templateParameters = 0; // consume the template parameters
+ }
symbol->setVisibility(semantic()->currentVisibility());