diff --git a/src/shared/cplusplus/CheckDeclaration.cpp b/src/shared/cplusplus/CheckDeclaration.cpp index 7e7d01d90718b85282653ceebe0a5d54d44da2c1..1e7afdd166d93e00550e5ea0eb2d7e3bb5300ea3 100644 --- a/src/shared/cplusplus/CheckDeclaration.cpp +++ b/src/shared/cplusplus/CheckDeclaration.cpp @@ -263,8 +263,29 @@ bool CheckDeclaration::visit(AsmDefinitionAST *) return false; } -bool CheckDeclaration::visit(ExceptionDeclarationAST *) +bool CheckDeclaration::visit(ExceptionDeclarationAST *ast) { + FullySpecifiedType ty = semantic()->check(ast->type_specifier, _scope); + FullySpecifiedType qualTy = ty.qualifiedType(); + + Name *name = 0; + FullySpecifiedType declTy = semantic()->check(ast->declarator, qualTy, + _scope, &name); + + unsigned location = locationOfDeclaratorId(ast->declarator); + if (! location) { + if (ast->declarator) + location = ast->declarator->firstToken(); + else + location = ast->firstToken(); + } + + Declaration *symbol = control()->newDeclaration(location, name); + symbol->setStartOffset(tokenAt(ast->firstToken()).offset); + symbol->setEndOffset(tokenAt(ast->lastToken()).offset); + symbol->setType(declTy); + _scope->enterSymbol(symbol); + return false; }