diff --git a/src/shared/cplusplus/CheckDeclaration.cpp b/src/shared/cplusplus/CheckDeclaration.cpp
index f320296d284fcc4635f133e952beacdd36829944..d3f914a3e8c25cde8e1cadfb2d59482ab4e7a29a 100644
--- a/src/shared/cplusplus/CheckDeclaration.cpp
+++ b/src/shared/cplusplus/CheckDeclaration.cpp
@@ -342,13 +342,18 @@ bool CheckDeclaration::visit(FunctionDefinitionAST *ast)
         return false;
     }
 
+    unsigned funStartOffset = tokenAt(ast->firstToken()).offset;
+    if (ast->declarator && ast->declarator->core_declarator) {
+        funStartOffset = tokenAt(ast->declarator->core_declarator->lastToken() - 1).end();
+    }
+
     Function *fun = funTy->asFunctionType();
     fun->setVirtual(ty.isVirtual());
     if (ty.isDeprecated())
         fun->setDeprecated(true);
     if (ty.isUnavailable())
         fun->setUnavailable(true);
-    fun->setStartOffset(tokenAt(ast->firstToken()).offset);
+    fun->setStartOffset(funStartOffset);
     fun->setEndOffset(tokenAt(ast->lastToken() - 1).end());
     if (ast->declarator)
         fun->setSourceLocation(ast->declarator->firstToken(), translationUnit());
diff --git a/src/shared/cplusplus/CheckSpecifier.cpp b/src/shared/cplusplus/CheckSpecifier.cpp
index 422bd7f3c4d7887864b8bd7641eb8c3bacd26325..ce5b6a38e2d5b13c46d1f92c99a0735df32803ef 100644
--- a/src/shared/cplusplus/CheckSpecifier.cpp
+++ b/src/shared/cplusplus/CheckSpecifier.cpp
@@ -310,9 +310,13 @@ bool CheckSpecifier::visit(ClassSpecifierAST *ast)
     if (ast->name)
         sourceLocation = ast->name->firstToken();
 
+    unsigned classScopeStart = tokenAt(ast->firstToken()).offset;
+    if (ast->lbrace_token)
+        classScopeStart = tokenAt(ast->lbrace_token).end();
+
     const Name *className = semantic()->check(ast->name, _scope);
     Class *klass = control()->newClass(sourceLocation, className);
-    klass->setStartOffset(tokenAt(ast->firstToken()).offset);
+    klass->setStartOffset(classScopeStart);
     klass->setEndOffset(tokenAt(ast->lastToken() - 1).end());
     ast->symbol = klass;
     unsigned classKey = tokenKind(ast->classkey_token);
@@ -397,9 +401,13 @@ bool CheckSpecifier::visit(EnumSpecifierAST *ast)
     if (ast->name)
         sourceLocation = ast->name->firstToken();
 
+    unsigned scopeStart = tokenAt(ast->firstToken()).offset;
+    if (ast->lbrace_token)
+        scopeStart = tokenAt(ast->lbrace_token).end();
+
     const Name *name = semantic()->check(ast->name, _scope);
     Enum *e = control()->newEnum(sourceLocation, name);
-    e->setStartOffset(tokenAt(ast->firstToken()).offset);
+    e->setStartOffset(scopeStart);
     e->setEndOffset(tokenAt(ast->lastToken() - 1).end());
     e->setVisibility(semantic()->currentVisibility());
     _scope->enterSymbol(e);
diff --git a/src/shared/cplusplus/CheckStatement.cpp b/src/shared/cplusplus/CheckStatement.cpp
index da6c24cd1748e356cd4405b023597c8c9b5135ab..dd778f7f5eb96e76d06940009ddf3d46a6f38b4f 100644
--- a/src/shared/cplusplus/CheckStatement.cpp
+++ b/src/shared/cplusplus/CheckStatement.cpp
@@ -111,7 +111,7 @@ bool CheckStatement::visit(CaseStatementAST *ast)
 bool CheckStatement::visit(CompoundStatementAST *ast)
 {
     Block *block = control()->newBlock(ast->lbrace_token);
-    block->setStartOffset(tokenAt(ast->firstToken()).offset);
+    block->setStartOffset(tokenAt(ast->firstToken()).end());
     block->setEndOffset(tokenAt(ast->lastToken() - 1).end());
     ast->symbol = block;
     _scope->enterSymbol(block);