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;
 }