diff options
author | Roberto Raggi <roberto.raggi@nokia.com> | 2010-03-19 11:08:58 +0100 |
---|---|---|
committer | Roberto Raggi <roberto.raggi@nokia.com> | 2010-03-19 11:09:35 +0100 |
commit | 273a64bbeb3bd542ee4405e8c8167a9283cbc5b9 (patch) | |
tree | 1a33545ac05495ec3ed288299bdeb6e10a440ce3 /src/shared/cplusplus | |
parent | d20fd0c8d8e69882f2ad9435fe353711086a402d (diff) | |
download | qt-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.cpp | 19 |
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()); |