diff --git a/src/shared/cplusplus/CheckDeclaration.cpp b/src/shared/cplusplus/CheckDeclaration.cpp
index 467e28c92dce68e0c87dac7dd587211a4f34f559..2e5db3f73dae68e8c94fca1499a19a2a6d8c9c30 100644
--- a/src/shared/cplusplus/CheckDeclaration.cpp
+++ b/src/shared/cplusplus/CheckDeclaration.cpp
@@ -231,7 +231,7 @@ bool CheckDeclaration::visit(SimpleDeclarationAST *ast)
 
         Declaration *symbol = control()->newDeclaration(location, name);
         symbol->setStartOffset(tokenAt(ast->firstToken()).offset);
-        symbol->setEndOffset(tokenAt(ast->lastToken()).offset);
+        symbol->setEndOffset(tokenAt(ast->lastToken() - 1).end());
 
         symbol->setType(declTy);
         if (declTy.isDeprecated())
@@ -322,7 +322,7 @@ bool CheckDeclaration::visit(ExceptionDeclarationAST *ast)
 
     Declaration *symbol = control()->newDeclaration(location, name);
     symbol->setStartOffset(tokenAt(ast->firstToken()).offset);
-    symbol->setEndOffset(tokenAt(ast->lastToken()).offset);
+    symbol->setEndOffset(tokenAt(ast->lastToken() - 1).end());
     symbol->setType(declTy);
     _scope->enterSymbol(symbol);
 
@@ -349,7 +349,7 @@ bool CheckDeclaration::visit(FunctionDefinitionAST *ast)
     if (ty.isUnavailable())
         fun->setUnavailable(true);
     fun->setStartOffset(tokenAt(ast->firstToken()).offset);
-    fun->setEndOffset(tokenAt(ast->lastToken()).offset);
+    fun->setEndOffset(tokenAt(ast->lastToken() - 1).end());
     if (ast->declarator)
         fun->setSourceLocation(ast->declarator->firstToken(), translationUnit());
     fun->setName(name);
@@ -415,7 +415,7 @@ bool CheckDeclaration::visit(NamespaceAST *ast)
 
     Namespace *ns = control()->newNamespace(sourceLocation, namespaceName);
     ns->setStartOffset(tokenAt(ast->firstToken()).offset);
-    ns->setEndOffset(tokenAt(ast->lastToken()).offset);
+    ns->setEndOffset(tokenAt(ast->lastToken() - 1).end());
     ast->symbol = ns;
     _scope->enterSymbol(ns);
     semantic()->check(ast->linkage_body, ns->members()); // ### we'll do the merge later.
@@ -440,7 +440,7 @@ bool CheckDeclaration::visit(NamespaceAliasDefinitionAST *ast)
     NamespaceAlias *namespaceAlias = control()->newNamespaceAlias(sourceLocation, name);
     namespaceAlias->setNamespaceName(namespaceName);
     namespaceAlias->setStartOffset(tokenAt(ast->firstToken()).offset);
-    namespaceAlias->setEndOffset(tokenAt(ast->lastToken()).offset);
+    namespaceAlias->setEndOffset(tokenAt(ast->lastToken() - 1).end());
     //ast->symbol = namespaceAlias;
     _scope->enterSymbol(namespaceAlias);
 
@@ -574,7 +574,7 @@ bool CheckDeclaration::visit(ObjCProtocolForwardDeclarationAST *ast)
         const Name *protocolName = semantic()->check(it->value, _scope);
         ObjCForwardProtocolDeclaration *fwdProtocol = control()->newObjCForwardProtocolDeclaration(sourceLocation, protocolName);
         fwdProtocol->setStartOffset(tokenAt(ast->firstToken()).offset);
-        fwdProtocol->setEndOffset(tokenAt(ast->lastToken()).offset);
+        fwdProtocol->setEndOffset(tokenAt(ast->lastToken() - 1).end());
 
         _scope->enterSymbol(fwdProtocol);
 
@@ -597,7 +597,7 @@ bool CheckDeclaration::visit(ObjCProtocolDeclarationAST *ast)
     const Name *protocolName = semantic()->check(ast->name, _scope);
     ObjCProtocol *protocol = control()->newObjCProtocol(sourceLocation, protocolName);
     protocol->setStartOffset(tokenAt(ast->firstToken()).offset);
-    protocol->setEndOffset(tokenAt(ast->lastToken()).offset);
+    protocol->setEndOffset(tokenAt(ast->lastToken() - 1).end());
 
     if (ast->protocol_refs && ast->protocol_refs->identifier_list) {
         for (NameListAST *iter = ast->protocol_refs->identifier_list; iter; iter = iter->next) {
@@ -635,7 +635,7 @@ bool CheckDeclaration::visit(ObjCClassForwardDeclarationAST *ast)
         const Name *className = semantic()->check(it->value, _scope);
         ObjCForwardClassDeclaration *fwdClass = control()->newObjCForwardClassDeclaration(sourceLocation, className);
         fwdClass->setStartOffset(tokenAt(ast->firstToken()).offset);
-        fwdClass->setEndOffset(tokenAt(ast->lastToken()).offset);
+        fwdClass->setEndOffset(tokenAt(ast->lastToken() - 1).end());
 
         _scope->enterSymbol(fwdClass);
 
@@ -658,7 +658,7 @@ bool CheckDeclaration::visit(ObjCClassDeclarationAST *ast)
     const Name *className = semantic()->check(ast->class_name, _scope);
     ObjCClass *klass = control()->newObjCClass(sourceLocation, className);
     klass->setStartOffset(tokenAt(ast->firstToken()).offset);
-    klass->setEndOffset(tokenAt(ast->lastToken()).offset);
+    klass->setEndOffset(tokenAt(ast->lastToken() - 1).end());
     ast->symbol = klass;
 
     klass->setInterface(ast->interface_token != 0);
@@ -733,7 +733,7 @@ bool CheckDeclaration::visit(ObjCMethodDeclarationAST *ast)
     }
 
     symbol->setStartOffset(tokenAt(ast->firstToken()).offset);
-    symbol->setEndOffset(tokenAt(ast->lastToken()).offset);
+    symbol->setEndOffset(tokenAt(ast->lastToken() - 1).end());
     symbol->setVisibility(semantic()->currentObjCVisibility());
     if (ty.isDeprecated())
         symbol->setDeprecated(true);
diff --git a/src/shared/cplusplus/CheckSpecifier.cpp b/src/shared/cplusplus/CheckSpecifier.cpp
index ee390d285f6d37363dc8c09c164130454531c0bb..e35d1d193c15f081e2e5566b9b897c94360eb732 100644
--- a/src/shared/cplusplus/CheckSpecifier.cpp
+++ b/src/shared/cplusplus/CheckSpecifier.cpp
@@ -326,7 +326,7 @@ bool CheckSpecifier::visit(ClassSpecifierAST *ast)
     const Name *className = semantic()->check(ast->name, _scope);
     Class *klass = control()->newClass(sourceLocation, className);
     klass->setStartOffset(tokenAt(ast->firstToken()).offset);
-    klass->setEndOffset(tokenAt(ast->lastToken()).offset);
+    klass->setEndOffset(tokenAt(ast->lastToken() - 1).end());
     ast->symbol = klass;
     unsigned classKey = tokenKind(ast->classkey_token);
     if (classKey == T_CLASS)
@@ -413,7 +413,7 @@ bool CheckSpecifier::visit(EnumSpecifierAST *ast)
     const Name *name = semantic()->check(ast->name, _scope);
     Enum *e = control()->newEnum(sourceLocation, name);
     e->setStartOffset(tokenAt(ast->firstToken()).offset);
-    e->setEndOffset(tokenAt(ast->lastToken()).offset);
+    e->setEndOffset(tokenAt(ast->lastToken() - 1).end());
     e->setVisibility(semantic()->currentVisibility());
     _scope->enterSymbol(e);
     _fullySpecifiedType.setType(e);
diff --git a/src/shared/cplusplus/CheckStatement.cpp b/src/shared/cplusplus/CheckStatement.cpp
index c476b2195dfe17c343bc3c0cd1241c36e3e0fd9e..da6c24cd1748e356cd4405b023597c8c9b5135ab 100644
--- a/src/shared/cplusplus/CheckStatement.cpp
+++ b/src/shared/cplusplus/CheckStatement.cpp
@@ -112,7 +112,7 @@ bool CheckStatement::visit(CompoundStatementAST *ast)
 {
     Block *block = control()->newBlock(ast->lbrace_token);
     block->setStartOffset(tokenAt(ast->firstToken()).offset);
-    block->setEndOffset(tokenAt(ast->lastToken()).offset);
+    block->setEndOffset(tokenAt(ast->lastToken() - 1).end());
     ast->symbol = block;
     _scope->enterSymbol(block);
     Scope *previousScope = switchScope(block->members());
@@ -177,7 +177,7 @@ bool CheckStatement::forEachFastEnum(unsigned firstToken,
 {
     Block *block = control()->newBlock(firstToken);
     block->setStartOffset(tokenAt(firstToken).offset);
-    block->setEndOffset(tokenAt(lastToken).offset);
+    block->setEndOffset(tokenAt(lastToken - 1).end());
     symbol = block;
     _scope->enterSymbol(block);
     Scope *previousScope = switchScope(block->members());
@@ -230,7 +230,7 @@ bool CheckStatement::visit(ForStatementAST *ast)
 {
     Block *block = control()->newBlock(ast->for_token);
     block->setStartOffset(tokenAt(ast->firstToken()).offset);
-    block->setEndOffset(tokenAt(ast->lastToken()).offset);
+    block->setEndOffset(tokenAt(ast->lastToken() - 1).end());
     ast->symbol = block;
     _scope->enterSymbol(block);
     Scope *previousScope = switchScope(block->members());
@@ -247,7 +247,7 @@ bool CheckStatement::visit(IfStatementAST *ast)
 {
     Block *block = control()->newBlock(ast->if_token);
     block->setStartOffset(tokenAt(ast->firstToken()).offset);
-    block->setEndOffset(tokenAt(ast->lastToken()).offset);
+    block->setEndOffset(tokenAt(ast->lastToken() - 1).end());
     ast->symbol = block;
     _scope->enterSymbol(block);
     Scope *previousScope = switchScope(block->members());
@@ -294,7 +294,7 @@ bool CheckStatement::visit(SwitchStatementAST *ast)
 {
     Block *block = control()->newBlock(ast->switch_token);
     block->setStartOffset(tokenAt(ast->firstToken()).offset);
-    block->setEndOffset(tokenAt(ast->lastToken()).offset);
+    block->setEndOffset(tokenAt(ast->lastToken() - 1).end());
     ast->symbol = block;
     _scope->enterSymbol(block);
     Scope *previousScope = switchScope(block->members());
@@ -319,7 +319,7 @@ bool CheckStatement::visit(CatchClauseAST *ast)
 {
     Block *block = control()->newBlock(ast->catch_token);
     block->setStartOffset(tokenAt(ast->firstToken()).offset);
-    block->setEndOffset(tokenAt(ast->lastToken()).offset);
+    block->setEndOffset(tokenAt(ast->lastToken() - 1).end());
     ast->symbol = block;
     _scope->enterSymbol(block);
     Scope *previousScope = switchScope(block->members());
@@ -334,7 +334,7 @@ bool CheckStatement::visit(WhileStatementAST *ast)
 {
     Block *block = control()->newBlock(ast->while_token);
     block->setStartOffset(tokenAt(ast->firstToken()).offset);
-    block->setEndOffset(tokenAt(ast->lastToken()).offset);
+    block->setEndOffset(tokenAt(ast->lastToken() - 1).end());
     ast->symbol = block;
     _scope->enterSymbol(block);
     Scope *previousScope = switchScope(block->members());