From 273a64bbeb3bd542ee4405e8c8167a9283cbc5b9 Mon Sep 17 00:00:00 2001 From: Roberto Raggi Date: Fri, 19 Mar 2010 11:08:58 +0100 Subject: Fixed possible leaks when processing friend template classes and template constructors. --- src/shared/cplusplus/CheckDeclaration.cpp | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) (limited to 'src/shared/cplusplus/CheckDeclaration.cpp') 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()); -- cgit v1.2.1