diff --git a/src/shared/cplusplus/Parser.cpp b/src/shared/cplusplus/Parser.cpp
index aa1a622b2ce37aa958fdbee86f5db646e86cb7e3..c9a2aedca1ca8e2a2882195a6e0c137795cbca6c 100644
--- a/src/shared/cplusplus/Parser.cpp
+++ b/src/shared/cplusplus/Parser.cpp
@@ -389,7 +389,7 @@ void Parser::match(int kind, unsigned *token)
         *token = consumeToken();
     else {
         *token = 0;
-        _translationUnit->error(_tokenIndex, "expected token `%s' got `%s'",
+        error(_tokenIndex, "expected token `%s' got `%s'",
                                 Token::name(kind), tok().spell());
     }
 }
@@ -536,7 +536,7 @@ bool Parser::parseTranslationUnit(TranslationUnitAST *&node)
             (*decl)->value = declaration;
             decl = &(*decl)->next;
         } else {
-            _translationUnit->error(start_declaration, "expected a declaration");
+            error(start_declaration, "expected a declaration");
             rewind(start_declaration + 1);
             skipUntilDeclaration();
         }
@@ -610,7 +610,7 @@ bool Parser::parseDeclaration(DeclarationAST *&node)
 
     case T_AT_END:
         // TODO: should this be done here, or higher-up?
-        _translationUnit->error(cursor(), "skip stray token `%s'", tok().spell());
+        error(cursor(), "skip stray token `%s'", tok().spell());
         consumeToken();
         break;
 
@@ -681,7 +681,7 @@ bool Parser::parseLinkageBody(DeclarationAST *&node)
                 (*declaration_ptr)->value = declaration;
                 declaration_ptr = &(*declaration_ptr)->next;
             } else {
-                _translationUnit->error(start_declaration, "expected a declaration");
+                error(start_declaration, "expected a declaration");
                 rewind(start_declaration + 1);
                 skipUntilDeclaration();
             }
@@ -760,8 +760,8 @@ bool Parser::parseUsingDirective(DeclarationAST *&node)
         ast->using_token = consumeToken();
         ast->namespace_token = consumeToken();
         if (! parseName(ast->name))
-            _translationUnit->warning(cursor(), "expected `namespace name' before `%s'",
-                                      tok().spell());
+            warning(cursor(), "expected `namespace name' before `%s'",
+                    tok().spell());
         match(T_SEMICOLON, &ast->semicolon_token);
         node = ast;
         return true;
@@ -992,7 +992,7 @@ bool Parser::parseTemplateDeclaration(DeclarationAST *&node)
         if (parseDeclaration(ast->declaration))
             break;
 
-        _translationUnit->error(start_declaration, "expected a declaration");
+        error(start_declaration, "expected a declaration");
         rewind(start_declaration + 1);
         skipUntilDeclaration();
     }
@@ -1195,7 +1195,7 @@ bool Parser::parseDeclSpecifierSeq(SpecifierListAST *&decl_specifier_seq,
                                                             lookAtClassKey())) {
             unsigned startOfElaboratedTypeSpecifier = cursor();
             if (! parseElaboratedTypeSpecifier(*decl_specifier_seq_ptr)) {
-                _translationUnit->error(startOfElaboratedTypeSpecifier,
+                error(startOfElaboratedTypeSpecifier,
                                         "expected an elaborated type specifier");
                 break;
             }
@@ -1259,7 +1259,7 @@ bool Parser::parseCoreDeclarator(DeclaratorAST *&node)
         }
     } else if (LA() == T_LPAREN) {
         if (attributes)
-            _translationUnit->warning(attributes->firstToken(), "unexpected attribtues");
+            warning(attributes->firstToken(), "unexpected attribtues");
 
         unsigned lparen_token = consumeToken();
         DeclaratorAST *declarator = 0;
@@ -1482,7 +1482,7 @@ bool Parser::parseEnumSpecifier(SpecifierListAST *&node)
                     break;
 
                 if (LA() != T_IDENTIFIER) {
-                    _translationUnit->error(cursor(), "expected identifier before '%s'", tok().spell());
+                    error(cursor(), "expected identifier before '%s'", tok().spell());
                     skipUntil(T_IDENTIFIER);
                 }
 
@@ -1734,7 +1734,7 @@ bool Parser::parseClassSpecifier(SpecifierListAST *&node)
     }
 
     if (LA(1) == T_IDENTIFIER && LA(2) == T_IDENTIFIER) {
-        _translationUnit->warning(cursor(), "skip identifier `%s'",
+        warning(cursor(), "skip identifier `%s'",
                                   tok().spell());
         consumeToken();
     }
@@ -1762,7 +1762,7 @@ bool Parser::parseClassSpecifier(SpecifierListAST *&node)
                 dot_dot_dot_token = consumeToken();
 
             if (LA() != T_LBRACE) {
-                _translationUnit->error(cursor(), "expected `{' before `%s'", tok().spell());
+                error(cursor(), "expected `{' before `%s'", tok().spell());
 
                 const unsigned saved = cursor();
 
@@ -1808,7 +1808,7 @@ bool Parser::parseClassSpecifier(SpecifierListAST *&node)
                     skipUntilDeclaration();
                 }
             } else {
-                _translationUnit->error(start_declaration, "expected a declaration");
+                error(start_declaration, "expected a declaration");
                 rewind(start_declaration + 1);
                 skipUntilDeclaration();
             }
@@ -1925,7 +1925,7 @@ bool Parser::parseQtPropertyDeclaration(DeclarationAST *&node)
                         bItem->expression = expr;
                         item = bItem;
                     } else {
-                        _translationUnit->error(cursor(),
+                        error(cursor(),
                                                 "expected expression before `%s'",
                                                 tok().spell());
                     }
@@ -1941,7 +1941,7 @@ bool Parser::parseQtPropertyDeclaration(DeclarationAST *&node)
                 }
 
                 default:
-                    _translationUnit->error(cursor(), "expected `)' before `%s'", tok().spell());
+                    error(cursor(), "expected `)' before `%s'", tok().spell());
                     // skip the token
                     consumeToken();
                 }
@@ -1953,7 +1953,7 @@ bool Parser::parseQtPropertyDeclaration(DeclarationAST *&node)
             } else if (!LA()) {
                 break;
             } else {
-                _translationUnit->error(cursor(), "expected `)' before `%s'", tok().spell());
+                error(cursor(), "expected `)' before `%s'", tok().spell());
                 // skip the token
                 consumeToken();
             }
@@ -2432,24 +2432,24 @@ bool Parser::parseMemInitializerList(MemInitializerListAST *&node)
 
             else if (LA() == T_COMMA || (LA() == T_IDENTIFIER && (LA(2) == T_LPAREN || LA(2) == T_COLON_COLON))) {
                 if (LA() != T_COMMA)
-                    _translationUnit->error(cursor(), "expected `,'");
+                    error(cursor(), "expected `,'");
                 else
                     consumeToken();
 
                 if (parseMemInitializer(*initializer))
                     initializer = &(*initializer)->next;
                 else
-                    _translationUnit->error(cursor(), "expected a member initializer");
+                    error(cursor(), "expected a member initializer");
 
             } else break;
         }
 
         if (_cxx0xEnabled && LA() == T_DOT_DOT_DOT) {
             if (LA(2) != T_LBRACE)
-                _translationUnit->error(cursor(), "expected `{'");
+                error(cursor(), "expected `{'");
 
         } else if (LA() != T_LBRACE) {
-            _translationUnit->error(cursor(), "expected `{'");
+            error(cursor(), "expected `{'");
         }
 
         return true;
@@ -2560,7 +2560,7 @@ bool Parser::parseBaseSpecifier(BaseSpecifierListAST *&node)
 
     parseName(ast->name);
     if (! ast->name)
-        _translationUnit->error(cursor(), "expected class-name");
+        error(cursor(), "expected class-name");
 
     node = new (_pool) BaseSpecifierListAST;
     node->value = ast;
@@ -3149,11 +3149,11 @@ bool Parser::parseIfStatement(StatementAST *&node)
         parseCondition(ast->condition);
         match(T_RPAREN, &ast->rparen_token);
         if (! parseStatement(ast->statement))
-            _translationUnit->error(cursor(), "expected statement");
+            error(cursor(), "expected statement");
         if (LA() == T_ELSE) {
             ast->else_token = consumeToken();
             if (! parseStatement(ast->else_statement))
-                _translationUnit->error(cursor(), "expected statement");
+                error(cursor(), "expected statement");
         }
         node = ast;
         return true;
@@ -3480,7 +3480,7 @@ bool Parser::parseSimpleDeclaration(DeclarationAST *&node,
             if (! parseElaboratedTypeSpecifier(*decl_specifier_seq_ptr) || LA() == T_LBRACE) {
                 rewind(startOfTypeSpecifier);
                 if (! parseEnumSpecifier(*decl_specifier_seq_ptr)) {
-                    _translationUnit->error(startOfTypeSpecifier,
+                    error(startOfTypeSpecifier,
                                             "expected an enum specifier");
                     break;
                 }
@@ -3491,7 +3491,7 @@ bool Parser::parseSimpleDeclaration(DeclarationAST *&node,
         } else if (! has_type_specifier && LA() == T_TYPENAME) {
             unsigned startOfElaboratedTypeSpecifier = cursor();
             if (! parseElaboratedTypeSpecifier(*decl_specifier_seq_ptr)) {
-                _translationUnit->error(startOfElaboratedTypeSpecifier,
+                error(startOfElaboratedTypeSpecifier,
                                         "expected an elaborated type specifier");
                 break;
             }
@@ -3504,7 +3504,7 @@ bool Parser::parseSimpleDeclaration(DeclarationAST *&node,
                                                          (LA(2) == T_COLON || LA(2) == T_LBRACE)))) {
                 rewind(startOfTypeSpecifier);
                 if (! parseClassSpecifier(*decl_specifier_seq_ptr)) {
-                    _translationUnit->error(startOfTypeSpecifier,
+                    error(startOfTypeSpecifier,
                                             "wrong type specifier");
                     break;
                 }
@@ -3586,7 +3586,7 @@ bool Parser::parseSimpleDeclaration(DeclarationAST *&node,
                         break;
 
                 if (LA() != T_LBRACE) {
-                    _translationUnit->error(pos, "unexpected token `%s'", _translationUnit->spell(pos));
+                    error(pos, "unexpected token `%s'", _translationUnit->spell(pos));
                     rewind(pos);
                 }
             }
@@ -3613,7 +3613,7 @@ bool Parser::parseSimpleDeclaration(DeclarationAST *&node,
         }
     }
 
-    _translationUnit->error(cursor(), "unexpected token `%s'", tok().spell());
+    error(cursor(), "unexpected token `%s'", tok().spell());
     return false;
 }
 
@@ -4352,7 +4352,7 @@ bool Parser::parsePostfixExpression(ExpressionAST *&node)
                 if (LA() == T_TEMPLATE)
                     ast->template_token = consumeToken();
                 if (! parseNameId(ast->member_name))
-                    _translationUnit->error(cursor(), "expected unqualified-id before token `%s'",
+                    error(cursor(), "expected unqualified-id before token `%s'",
                                             tok().spell());
                 ast->base_expression = node;
                 node = ast;
@@ -4379,7 +4379,7 @@ bool Parser::parseUnaryExpression(ExpressionAST *&node)
         UnaryExpressionAST *ast = new (_pool) UnaryExpressionAST;
         ast->unary_op_token = consumeToken();
         if (! parseCastExpression(ast->expression)) {
-            _translationUnit->error(op, "expected expression after token `%s'",
+            error(op, "expected expression after token `%s'",
                                     _translationUnit->spell(op));
         }
         node = ast;
@@ -4707,7 +4707,7 @@ bool Parser::parseQtMethod(ExpressionAST *&node)
         ast->method_token = consumeToken();
         match(T_LPAREN, &ast->lparen_token);
         if (! parseDeclarator(ast->declarator))
-            _translationUnit->error(cursor(), "expected a function declarator before token `%s'",
+            error(cursor(), "expected a function declarator before token `%s'",
                                     tok().spell());
         match(T_RPAREN, &ast->rparen_token);
         node = ast;
@@ -4906,7 +4906,7 @@ bool Parser::parseObjCInterface(DeclarationAST *&node,
         // a category interface
 
         if (attributes)
-            _translationUnit->error(attributes->firstToken(),
+            error(attributes->firstToken(),
                                     "invalid attributes for category interface declaration");
 
         ObjCClassDeclarationAST *ast = new (_pool) ObjCClassDeclarationAST;
@@ -5190,7 +5190,7 @@ bool Parser::parseObjCMethodDefinitionList(DeclarationListAST *&node)
             } else {
                 if (! parseBlockDeclaration(declaration)) {
                     rewind(start);
-                    _translationUnit->error(cursor(),
+                    error(cursor(),
                                             "skip token `%s'", tok().spell());
 
                     consumeToken();
@@ -5293,7 +5293,7 @@ bool Parser::parseObjClassInstanceVariables(ObjCInstanceVariablesDeclarationAST
 
         if (start == cursor()) {
             // skip stray token.
-            _translationUnit->error(cursor(), "skip stray token `%s'", tok().spell());
+            error(cursor(), "skip stray token `%s'", tok().spell());
             consumeToken();
         }
     }
@@ -5404,7 +5404,7 @@ bool Parser::parseObjCPropertyDeclaration(DeclarationAST *&node, SpecifierListAS
                 last->next = new (_pool) ObjCPropertyAttributeListAST;
                 last = last->next;
                 if (!parseObjCPropertyAttribute(last->value)) {
-                    _translationUnit->error(_tokenIndex, "expected token `%s' got `%s'",
+                    error(_tokenIndex, "expected token `%s' got `%s'",
                                             Token::name(T_IDENTIFIER), tok().spell());
                     break;
                 }
@@ -5417,7 +5417,7 @@ bool Parser::parseObjCPropertyDeclaration(DeclarationAST *&node, SpecifierListAS
     if (parseSimpleDeclaration(ast->simple_declaration, /*accept-struct-declarators = */ true))
         node = ast;
     else
-        _translationUnit->error(_tokenIndex, "expected a simple declaration");
+        error(_tokenIndex, "expected a simple declaration");
 
     return true;
 }
@@ -5482,7 +5482,7 @@ bool Parser::parseObjCMethodPrototype(ObjCMethodPrototypeAST *&node)
         parseObjCSelector(sel->selector_argument_list->value->name_token);
         ast->selector = sel;
     } else {
-        _translationUnit->error(cursor(), "expected a selector");
+        error(cursor(), "expected a selector");
     }
 
     SpecifierListAST **attr = &ast->attribute_list;
@@ -5830,3 +5830,33 @@ void Parser::rewind(unsigned cursor)
     else
         _tokenIndex = _translationUnit->tokenCount() - 1;
 }
+
+void Parser::warning(unsigned index, const char *format, ...)
+{
+    va_list args, ap;
+    va_start(args, format);
+    va_copy(ap, args);
+    _translationUnit->message(DiagnosticClient::Warning, index, format, ap);
+    va_end(ap);
+    va_end(args);
+}
+
+void Parser::error(unsigned index, const char *format, ...)
+{
+    va_list args, ap;
+    va_start(args, format);
+    va_copy(ap, args);
+    _translationUnit->message(DiagnosticClient::Error, index, format, ap);
+    va_end(ap);
+    va_end(args);
+}
+
+void Parser::fatal(unsigned index, const char *format, ...)
+{
+    va_list args, ap;
+    va_start(args, format);
+    va_copy(ap, args);
+    _translationUnit->message(DiagnosticClient::Fatal, index, format, ap);
+    va_end(ap);
+    va_end(args);
+}
diff --git a/src/shared/cplusplus/Parser.h b/src/shared/cplusplus/Parser.h
index c383c2bda949bd9148c2bf7b6e251df41d42dc25..ec8a74538b828b2006e1ac39c7a0d152396354f0 100644
--- a/src/shared/cplusplus/Parser.h
+++ b/src/shared/cplusplus/Parser.h
@@ -296,7 +296,11 @@ public:
     int peekAtQtContextKeyword() const;
 
     bool switchTemplateArguments(bool templateArguments);
+
     bool blockErrors(bool block);
+    void warning(unsigned index, const char *format, ...);
+    void error(unsigned index, const char *format, ...);
+    void fatal(unsigned index, const char *format, ...);
 
     inline const Token &tok(int i = 1) const
     { return _translationUnit->tokenAt(_tokenIndex + i - 1); }
diff --git a/src/shared/cplusplus/TranslationUnit.cpp b/src/shared/cplusplus/TranslationUnit.cpp
index 380af92983d352f5f70acc10ed8bc64eb94ee2c5..a3ba0714d70b56e9fabb82d73eccf456788122f3 100644
--- a/src/shared/cplusplus/TranslationUnit.cpp
+++ b/src/shared/cplusplus/TranslationUnit.cpp
@@ -429,7 +429,7 @@ void TranslationUnit::warning(unsigned index, const char *format, ...)
     va_list args, ap;
     va_start(args, format);
     va_copy(ap, args);
-    message(DiagnosticClient::Fatal, index, format, args);
+    message(DiagnosticClient::Warning, index, format, args);
     va_end(ap);
     va_end(args);
 }