diff --git a/src/libs/cplusplus/ASTPath.cpp b/src/libs/cplusplus/ASTPath.cpp
index 28f5437d8c2c24da98854e474b41a38dc510661f..89f407895bfd755238a2807572838f69d34ba054 100644
--- a/src/libs/cplusplus/ASTPath.cpp
+++ b/src/libs/cplusplus/ASTPath.cpp
@@ -67,7 +67,9 @@ bool ASTPath::preVisit(AST *ast)
     unsigned firstToken = ast->firstToken();
     unsigned lastToken = ast->lastToken();
 
-    if (firstToken > 0 && lastToken > firstToken) {
+    if (firstToken > 0) {
+        Q_ASSERT(lastToken > firstToken);
+
         unsigned startLine, startColumn;
         getTokenStartPosition(firstToken, &startLine, &startColumn);
 
diff --git a/src/plugins/cppeditor/cpprefactoringchanges.cpp b/src/plugins/cppeditor/cpprefactoringchanges.cpp
index 842e6294a826f259563e1fbca55dc50f6f843c10..ff2a912765015b4fc30b237c777fa544048771d2 100644
--- a/src/plugins/cppeditor/cpprefactoringchanges.cpp
+++ b/src/plugins/cppeditor/cpprefactoringchanges.cpp
@@ -184,10 +184,9 @@ int CppRefactoringFile::endOf(unsigned index) const
 
 int CppRefactoringFile::endOf(const AST *ast) const
 {
-    if (unsigned end = ast->lastToken())
-        return endOf(end - 1);
-    else
-        return 0;
+    unsigned end = ast->lastToken();
+    Q_ASSERT(end > 0);
+    return endOf(end - 1);
 }
 
 void CppRefactoringFile::startAndEndOf(unsigned index, int *start, int *end) const
diff --git a/src/shared/cplusplus/AST.cpp b/src/shared/cplusplus/AST.cpp
index 8430d0b1e313957213b23e9c42060fe40a514421..43b5cb455392a3e23ae5abc3cc09bcd8169f222d 100644
--- a/src/shared/cplusplus/AST.cpp
+++ b/src/shared/cplusplus/AST.cpp
@@ -149,7 +149,7 @@ unsigned AccessDeclarationAST::lastToken() const
         return slots_token + 1;
     if (access_specifier_token)
         return access_specifier_token + 1;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -181,7 +181,7 @@ unsigned ArrayAccessAST::lastToken() const
     if (base_expression)
         if (unsigned candidate = base_expression->lastToken())
             return candidate;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -207,7 +207,7 @@ unsigned ArrayDeclaratorAST::lastToken() const
             return candidate;
     if (lbracket_token)
         return lbracket_token + 1;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -233,7 +233,7 @@ unsigned ArrayInitializerAST::lastToken() const
             return candidate;
     if (lbrace_token)
         return lbrace_token + 1;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -265,7 +265,7 @@ unsigned AsmDefinitionAST::lastToken() const
         return volatile_token + 1;
     if (asm_token)
         return asm_token + 1;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -299,7 +299,7 @@ unsigned AttributeAST::lastToken() const
         return lparen_token + 1;
     if (identifier_token)
         return identifier_token + 1;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -327,7 +327,7 @@ unsigned BinaryExpressionAST::lastToken() const
     if (left_expression)
         if (unsigned candidate = left_expression->lastToken())
             return candidate;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -343,7 +343,7 @@ unsigned BoolLiteralAST::lastToken() const
 {
     if (literal_token)
         return literal_token + 1;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -373,7 +373,7 @@ unsigned BracedInitializerAST::lastToken() const
             return candidate;
     if (lbrace_token)
         return lbrace_token + 1;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -393,7 +393,7 @@ unsigned BreakStatementAST::lastToken() const
         return semicolon_token + 1;
     if (break_token)
         return break_token + 1;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -425,7 +425,7 @@ unsigned CallAST::lastToken() const
     if (base_expression)
         if (unsigned candidate = base_expression->lastToken())
             return candidate;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -437,7 +437,7 @@ unsigned CaptureAST::firstToken() const
 /** \generated */
 unsigned CaptureAST::lastToken() const
 {
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -469,7 +469,7 @@ unsigned CaseStatementAST::lastToken() const
             return candidate;
     if (case_token)
         return case_token + 1;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -501,7 +501,7 @@ unsigned CastExpressionAST::lastToken() const
             return candidate;
     if (lparen_token)
         return lparen_token + 1;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -537,7 +537,7 @@ unsigned CatchClauseAST::lastToken() const
         return lparen_token + 1;
     if (catch_token)
         return catch_token + 1;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -593,7 +593,7 @@ unsigned ClassSpecifierAST::lastToken() const
             return candidate;
     if (classkey_token)
         return classkey_token + 1;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -619,7 +619,7 @@ unsigned CompoundExpressionAST::lastToken() const
             return candidate;
     if (lparen_token)
         return lparen_token + 1;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -651,7 +651,7 @@ unsigned CompoundLiteralAST::lastToken() const
             return candidate;
     if (lparen_token)
         return lparen_token + 1;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -677,7 +677,7 @@ unsigned CompoundStatementAST::lastToken() const
             return candidate;
     if (lbrace_token)
         return lbrace_token + 1;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -701,7 +701,7 @@ unsigned ConditionAST::lastToken() const
     if (type_specifier_list)
         if (unsigned candidate = type_specifier_list->lastToken())
             return candidate;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -739,7 +739,7 @@ unsigned ConditionalExpressionAST::lastToken() const
     if (condition)
         if (unsigned candidate = condition->lastToken())
             return candidate;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -759,7 +759,7 @@ unsigned ContinueStatementAST::lastToken() const
         return semicolon_token + 1;
     if (continue_token)
         return continue_token + 1;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -787,7 +787,7 @@ unsigned ConversionFunctionIdAST::lastToken() const
             return candidate;
     if (operator_token)
         return operator_token + 1;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -831,7 +831,7 @@ unsigned CppCastExpressionAST::lastToken() const
         return less_token + 1;
     if (cast_token)
         return cast_token + 1;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -857,7 +857,7 @@ unsigned CtorInitializerAST::lastToken() const
             return candidate;
     if (colon_token)
         return colon_token + 1;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -875,7 +875,7 @@ unsigned DeclarationStatementAST::lastToken() const
     if (declaration)
         if (unsigned candidate = declaration->lastToken())
             return candidate;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -927,7 +927,7 @@ unsigned DeclaratorAST::lastToken() const
     if (attribute_list)
         if (unsigned candidate = attribute_list->lastToken())
             return candidate;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -949,7 +949,7 @@ unsigned DeclaratorIdAST::lastToken() const
             return candidate;
     if (dot_dot_dot_token)
         return dot_dot_dot_token + 1;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -983,7 +983,7 @@ unsigned DeleteExpressionAST::lastToken() const
         return delete_token + 1;
     if (scope_token)
         return scope_token + 1;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -1003,7 +1003,7 @@ unsigned DestructorNameAST::lastToken() const
         return identifier_token + 1;
     if (tilde_token)
         return tilde_token + 1;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -1047,7 +1047,7 @@ unsigned DoStatementAST::lastToken() const
             return candidate;
     if (do_token)
         return do_token + 1;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -1075,7 +1075,7 @@ unsigned ElaboratedTypeSpecifierAST::lastToken() const
             return candidate;
     if (classkey_token)
         return classkey_token + 1;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -1091,7 +1091,7 @@ unsigned EmptyDeclarationAST::lastToken() const
 {
     if (semicolon_token)
         return semicolon_token + 1;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -1127,7 +1127,7 @@ unsigned EnumSpecifierAST::lastToken() const
             return candidate;
     if (enum_token)
         return enum_token + 1;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -1153,7 +1153,7 @@ unsigned EnumeratorAST::lastToken() const
         return equal_token + 1;
     if (identifier_token)
         return identifier_token + 1;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -1181,7 +1181,7 @@ unsigned ExceptionDeclarationAST::lastToken() const
     if (type_specifier_list)
         if (unsigned candidate = type_specifier_list->lastToken())
             return candidate;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -1215,7 +1215,7 @@ unsigned ExceptionSpecificationAST::lastToken() const
         return lparen_token + 1;
     if (throw_token)
         return throw_token + 1;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -1239,7 +1239,7 @@ unsigned ExpressionOrDeclarationStatementAST::lastToken() const
     if (expression)
         if (unsigned candidate = expression->lastToken())
             return candidate;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -1261,7 +1261,7 @@ unsigned ExpressionStatementAST::lastToken() const
     if (expression)
         if (unsigned candidate = expression->lastToken())
             return candidate;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -1313,7 +1313,7 @@ unsigned ForStatementAST::lastToken() const
         return lparen_token + 1;
     if (for_token)
         return for_token + 1;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -1371,7 +1371,7 @@ unsigned ForeachStatementAST::lastToken() const
         return lparen_token + 1;
     if (foreach_token)
         return foreach_token + 1;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -1421,7 +1421,7 @@ unsigned FunctionDeclaratorAST::lastToken() const
             return candidate;
     if (lparen_token)
         return lparen_token + 1;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -1461,7 +1461,7 @@ unsigned FunctionDefinitionAST::lastToken() const
             return candidate;
     if (qt_invokable_token)
         return qt_invokable_token + 1;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -1485,9 +1485,27 @@ unsigned GotoStatementAST::lastToken() const
         return identifier_token + 1;
     if (goto_token)
         return goto_token + 1;
+    return 1;
+}
+
+/** \generated */
+unsigned IdExpressionAST::firstToken() const
+{
+    if (name)
+        if (unsigned candidate = name->firstToken())
+            return candidate;
     return 0;
 }
 
+/** \generated */
+unsigned IdExpressionAST::lastToken() const
+{
+    if (name)
+        if (unsigned candidate = name->lastToken())
+            return candidate;
+    return 1;
+}
+
 /** \generated */
 unsigned IfStatementAST::firstToken() const
 {
@@ -1531,7 +1549,7 @@ unsigned IfStatementAST::lastToken() const
         return lparen_token + 1;
     if (if_token)
         return if_token + 1;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -1557,7 +1575,7 @@ unsigned LabeledStatementAST::lastToken() const
         return colon_token + 1;
     if (label_token)
         return label_token + 1;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -1579,7 +1597,7 @@ unsigned LambdaCaptureAST::lastToken() const
             return candidate;
     if (default_capture_token)
         return default_capture_token + 1;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -1627,7 +1645,7 @@ unsigned LambdaDeclaratorAST::lastToken() const
             return candidate;
     if (lparen_token)
         return lparen_token + 1;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -1657,7 +1675,7 @@ unsigned LambdaExpressionAST::lastToken() const
     if (lambda_introducer)
         if (unsigned candidate = lambda_introducer->lastToken())
             return candidate;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -1683,7 +1701,7 @@ unsigned LambdaIntroducerAST::lastToken() const
             return candidate;
     if (lbracket_token)
         return lbracket_token + 1;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -1709,7 +1727,7 @@ unsigned LinkageBodyAST::lastToken() const
             return candidate;
     if (lbrace_token)
         return lbrace_token + 1;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -1735,7 +1753,7 @@ unsigned LinkageSpecificationAST::lastToken() const
         return extern_type_token + 1;
     if (extern_token)
         return extern_token + 1;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -1767,7 +1785,7 @@ unsigned MemInitializerAST::lastToken() const
     if (name)
         if (unsigned candidate = name->lastToken())
             return candidate;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -1799,7 +1817,7 @@ unsigned MemberAccessAST::lastToken() const
     if (base_expression)
         if (unsigned candidate = base_expression->lastToken())
             return candidate;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -1817,7 +1835,7 @@ unsigned NamedTypeSpecifierAST::lastToken() const
     if (name)
         if (unsigned candidate = name->lastToken())
             return candidate;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -1849,7 +1867,7 @@ unsigned NamespaceAST::lastToken() const
         return identifier_token + 1;
     if (namespace_token)
         return namespace_token + 1;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -1883,7 +1901,7 @@ unsigned NamespaceAliasDefinitionAST::lastToken() const
         return namespace_name_token + 1;
     if (namespace_token)
         return namespace_token + 1;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -1909,7 +1927,7 @@ unsigned NestedDeclaratorAST::lastToken() const
             return candidate;
     if (lparen_token)
         return lparen_token + 1;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -1935,7 +1953,7 @@ unsigned NestedExpressionAST::lastToken() const
             return candidate;
     if (lparen_token)
         return lparen_token + 1;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -1957,7 +1975,7 @@ unsigned NestedNameSpecifierAST::lastToken() const
     if (class_or_namespace_name)
         if (unsigned candidate = class_or_namespace_name->lastToken())
             return candidate;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -1983,7 +2001,7 @@ unsigned NewArrayDeclaratorAST::lastToken() const
             return candidate;
     if (lbracket_token)
         return lbracket_token + 1;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -2035,7 +2053,7 @@ unsigned NewExpressionAST::lastToken() const
         return new_token + 1;
     if (scope_token)
         return scope_token + 1;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -2061,7 +2079,7 @@ unsigned NewInitializerAST::lastToken() const
             return candidate;
     if (lparen_token)
         return lparen_token + 1;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -2087,7 +2105,7 @@ unsigned NewPlacementAST::lastToken() const
             return candidate;
     if (lparen_token)
         return lparen_token + 1;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -2117,7 +2135,7 @@ unsigned NewTypeIdAST::lastToken() const
     if (type_specifier_list)
         if (unsigned candidate = type_specifier_list->lastToken())
             return candidate;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -2133,7 +2151,7 @@ unsigned NumericLiteralAST::lastToken() const
 {
     if (literal_token)
         return literal_token + 1;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -2211,7 +2229,7 @@ unsigned ObjCClassDeclarationAST::lastToken() const
     if (attribute_list)
         if (unsigned candidate = attribute_list->lastToken())
             return candidate;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -2243,7 +2261,7 @@ unsigned ObjCClassForwardDeclarationAST::lastToken() const
     if (attribute_list)
         if (unsigned candidate = attribute_list->lastToken())
             return candidate;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -2269,7 +2287,7 @@ unsigned ObjCDynamicPropertiesDeclarationAST::lastToken() const
             return candidate;
     if (dynamic_token)
         return dynamic_token + 1;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -2291,7 +2309,7 @@ unsigned ObjCEncodeExpressionAST::lastToken() const
             return candidate;
     if (encode_token)
         return encode_token + 1;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -2349,7 +2367,7 @@ unsigned ObjCFastEnumerationAST::lastToken() const
         return lparen_token + 1;
     if (for_token)
         return for_token + 1;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -2375,7 +2393,7 @@ unsigned ObjCInstanceVariablesDeclarationAST::lastToken() const
             return candidate;
     if (lbrace_token)
         return lbrace_token + 1;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -2393,7 +2411,7 @@ unsigned ObjCMessageArgumentAST::lastToken() const
     if (parameter_value_expression)
         if (unsigned candidate = parameter_value_expression->lastToken())
             return candidate;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -2423,7 +2441,7 @@ unsigned ObjCMessageArgumentDeclarationAST::lastToken() const
     if (type_name)
         if (unsigned candidate = type_name->lastToken())
             return candidate;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -2461,7 +2479,7 @@ unsigned ObjCMessageExpressionAST::lastToken() const
             return candidate;
     if (lbracket_token)
         return lbracket_token + 1;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -2489,7 +2507,7 @@ unsigned ObjCMethodDeclarationAST::lastToken() const
     if (method_prototype)
         if (unsigned candidate = method_prototype->lastToken())
             return candidate;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -2533,7 +2551,7 @@ unsigned ObjCMethodPrototypeAST::lastToken() const
             return candidate;
     if (method_type_token)
         return method_type_token + 1;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -2559,7 +2577,7 @@ unsigned ObjCPropertyAttributeAST::lastToken() const
         return equals_token + 1;
     if (attribute_identifier_token)
         return attribute_identifier_token + 1;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -2601,7 +2619,7 @@ unsigned ObjCPropertyDeclarationAST::lastToken() const
     if (attribute_list)
         if (unsigned candidate = attribute_list->lastToken())
             return candidate;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -2645,7 +2663,7 @@ unsigned ObjCProtocolDeclarationAST::lastToken() const
     if (attribute_list)
         if (unsigned candidate = attribute_list->lastToken())
             return candidate;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -2673,7 +2691,7 @@ unsigned ObjCProtocolExpressionAST::lastToken() const
         return lparen_token + 1;
     if (protocol_token)
         return protocol_token + 1;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -2705,7 +2723,7 @@ unsigned ObjCProtocolForwardDeclarationAST::lastToken() const
     if (attribute_list)
         if (unsigned candidate = attribute_list->lastToken())
             return candidate;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -2731,7 +2749,7 @@ unsigned ObjCProtocolRefsAST::lastToken() const
             return candidate;
     if (less_token)
         return less_token + 1;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -2749,7 +2767,7 @@ unsigned ObjCSelectorAST::lastToken() const
     if (selector_argument_list)
         if (unsigned candidate = selector_argument_list->lastToken())
             return candidate;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -2769,7 +2787,7 @@ unsigned ObjCSelectorArgumentAST::lastToken() const
         return colon_token + 1;
     if (name_token)
         return name_token + 1;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -2799,7 +2817,7 @@ unsigned ObjCSelectorExpressionAST::lastToken() const
         return lparen_token + 1;
     if (selector_token)
         return selector_token + 1;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -2835,7 +2853,7 @@ unsigned ObjCSynchronizedStatementAST::lastToken() const
         return lparen_token + 1;
     if (synchronized_token)
         return synchronized_token + 1;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -2861,7 +2879,7 @@ unsigned ObjCSynthesizedPropertiesDeclarationAST::lastToken() const
             return candidate;
     if (synthesized_token)
         return synthesized_token + 1;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -2885,7 +2903,7 @@ unsigned ObjCSynthesizedPropertyAST::lastToken() const
         return equals_token + 1;
     if (property_identifier_token)
         return property_identifier_token + 1;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -2915,7 +2933,7 @@ unsigned ObjCTypeNameAST::lastToken() const
         return type_qualifier_token + 1;
     if (lparen_token)
         return lparen_token + 1;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -2931,7 +2949,7 @@ unsigned ObjCVisibilityDeclarationAST::lastToken() const
 {
     if (visibility_token)
         return visibility_token + 1;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -2955,7 +2973,7 @@ unsigned OperatorAST::lastToken() const
         return open_token + 1;
     if (op_token)
         return op_token + 1;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -2977,7 +2995,7 @@ unsigned OperatorFunctionIdAST::lastToken() const
             return candidate;
     if (operator_token)
         return operator_token + 1;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -3011,7 +3029,7 @@ unsigned ParameterDeclarationAST::lastToken() const
     if (type_specifier_list)
         if (unsigned candidate = type_specifier_list->lastToken())
             return candidate;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -3033,7 +3051,7 @@ unsigned ParameterDeclarationClauseAST::lastToken() const
     if (parameter_declaration_list)
         if (unsigned candidate = parameter_declaration_list->lastToken())
             return candidate;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -3055,7 +3073,7 @@ unsigned PointerAST::lastToken() const
             return candidate;
     if (star_token)
         return star_token + 1;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -3087,7 +3105,7 @@ unsigned PointerToMemberAST::lastToken() const
             return candidate;
     if (global_scope_token)
         return global_scope_token + 1;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -3109,7 +3127,7 @@ unsigned PostIncrDecrAST::lastToken() const
     if (base_expression)
         if (unsigned candidate = base_expression->lastToken())
             return candidate;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -3139,7 +3157,7 @@ unsigned QtEnumDeclarationAST::lastToken() const
         return lparen_token + 1;
     if (enum_specifier_token)
         return enum_specifier_token + 1;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -3169,7 +3187,7 @@ unsigned QtFlagsDeclarationAST::lastToken() const
         return lparen_token + 1;
     if (flags_specifier_token)
         return flags_specifier_token + 1;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -3193,7 +3211,7 @@ unsigned QtInterfaceNameAST::lastToken() const
     if (interface_name)
         if (unsigned candidate = interface_name->lastToken())
             return candidate;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -3223,7 +3241,7 @@ unsigned QtInterfacesDeclarationAST::lastToken() const
         return lparen_token + 1;
     if (interfaces_token)
         return interfaces_token + 1;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -3253,7 +3271,7 @@ unsigned QtMemberDeclarationAST::lastToken() const
         return lparen_token + 1;
     if (q_token)
         return q_token + 1;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -3283,7 +3301,7 @@ unsigned QtMethodAST::lastToken() const
         return lparen_token + 1;
     if (method_token)
         return method_token + 1;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -3299,7 +3317,7 @@ unsigned QtObjectTagAST::lastToken() const
 {
     if (q_object_token)
         return q_object_token + 1;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -3351,7 +3369,7 @@ unsigned QtPrivateSlotAST::lastToken() const
         return lparen_token + 1;
     if (q_private_slot_token)
         return q_private_slot_token + 1;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -3393,7 +3411,7 @@ unsigned QtPropertyDeclarationAST::lastToken() const
         return lparen_token + 1;
     if (property_specifier_token)
         return property_specifier_token + 1;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -3415,7 +3433,7 @@ unsigned QtPropertyDeclarationItemAST::lastToken() const
             return candidate;
     if (item_name_token)
         return item_name_token + 1;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -3443,7 +3461,7 @@ unsigned QualifiedNameAST::lastToken() const
             return candidate;
     if (global_scope_token)
         return global_scope_token + 1;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -3459,7 +3477,7 @@ unsigned ReferenceAST::lastToken() const
 {
     if (reference_token)
         return reference_token + 1;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -3485,7 +3503,7 @@ unsigned ReturnStatementAST::lastToken() const
             return candidate;
     if (return_token)
         return return_token + 1;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -3517,7 +3535,7 @@ unsigned SimpleDeclarationAST::lastToken() const
             return candidate;
     if (qt_invokable_token)
         return qt_invokable_token + 1;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -3533,7 +3551,7 @@ unsigned SimpleNameAST::lastToken() const
 {
     if (identifier_token)
         return identifier_token + 1;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -3549,7 +3567,7 @@ unsigned SimpleSpecifierAST::lastToken() const
 {
     if (specifier_token)
         return specifier_token + 1;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -3583,7 +3601,7 @@ unsigned SizeofExpressionAST::lastToken() const
         return dot_dot_dot_token + 1;
     if (sizeof_token)
         return sizeof_token + 1;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -3605,7 +3623,7 @@ unsigned StringLiteralAST::lastToken() const
             return candidate;
     if (literal_token)
         return literal_token + 1;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -3641,7 +3659,7 @@ unsigned SwitchStatementAST::lastToken() const
         return lparen_token + 1;
     if (switch_token)
         return switch_token + 1;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -3681,7 +3699,7 @@ unsigned TemplateDeclarationAST::lastToken() const
         return template_token + 1;
     if (export_token)
         return export_token + 1;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -3715,7 +3733,7 @@ unsigned TemplateIdAST::lastToken() const
         return identifier_token + 1;
     if (template_token)
         return template_token + 1;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -3769,7 +3787,7 @@ unsigned TemplateTypeParameterAST::lastToken() const
         return less_token + 1;
     if (template_token)
         return template_token + 1;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -3785,7 +3803,7 @@ unsigned ThisExpressionAST::lastToken() const
 {
     if (this_token)
         return this_token + 1;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -3807,7 +3825,7 @@ unsigned ThrowExpressionAST::lastToken() const
             return candidate;
     if (throw_token)
         return throw_token + 1;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -3841,7 +3859,7 @@ unsigned TrailingReturnTypeAST::lastToken() const
             return candidate;
     if (arrow_token)
         return arrow_token + 1;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -3859,7 +3877,7 @@ unsigned TranslationUnitAST::lastToken() const
     if (declaration_list)
         if (unsigned candidate = declaration_list->lastToken())
             return candidate;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -3887,7 +3905,7 @@ unsigned TryBlockStatementAST::lastToken() const
             return candidate;
     if (try_token)
         return try_token + 1;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -3919,7 +3937,7 @@ unsigned TypeConstructorCallAST::lastToken() const
     if (type_specifier_list)
         if (unsigned candidate = type_specifier_list->lastToken())
             return candidate;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -3943,7 +3961,7 @@ unsigned TypeIdAST::lastToken() const
     if (type_specifier_list)
         if (unsigned candidate = type_specifier_list->lastToken())
             return candidate;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -3973,7 +3991,7 @@ unsigned TypeidExpressionAST::lastToken() const
         return lparen_token + 1;
     if (typeid_token)
         return typeid_token + 1;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -4009,7 +4027,7 @@ unsigned TypenameCallExpressionAST::lastToken() const
             return candidate;
     if (typename_token)
         return typename_token + 1;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -4045,7 +4063,7 @@ unsigned TypenameTypeParameterAST::lastToken() const
         return dot_dot_dot_token + 1;
     if (classkey_token)
         return classkey_token + 1;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -4075,7 +4093,7 @@ unsigned TypeofSpecifierAST::lastToken() const
         return lparen_token + 1;
     if (typeof_token)
         return typeof_token + 1;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -4097,7 +4115,7 @@ unsigned UnaryExpressionAST::lastToken() const
             return candidate;
     if (unary_op_token)
         return unary_op_token + 1;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -4127,7 +4145,7 @@ unsigned UsingAST::lastToken() const
         return typename_token + 1;
     if (using_token)
         return using_token + 1;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -4157,7 +4175,7 @@ unsigned UsingDirectiveAST::lastToken() const
         return namespace_token + 1;
     if (using_token)
         return using_token + 1;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -4193,7 +4211,7 @@ unsigned WhileStatementAST::lastToken() const
         return lparen_token + 1;
     if (while_token)
         return while_token + 1;
-    return 0;
+    return 1;
 }
 
 /** \generated */
@@ -4212,24 +4230,6 @@ unsigned AttributeSpecifierAST::lastToken() const
         return first_lparen_token + 1;
     if (attribute_token)
         return attribute_token + 1;
-    return 0;
-}
-
-/** \generated */
-unsigned IdExpressionAST::firstToken() const
-{
-    if (name)
-        if (unsigned candidate = name->firstToken())
-            return candidate;
-    return 0;
-}
-
-/** \generated */
-unsigned IdExpressionAST::lastToken() const
-{
-    if (name)
-        if (unsigned candidate = name->lastToken())
-            return candidate;
-    return 0;
+    return 1;
 }
 
diff --git a/src/shared/cplusplus/Bind.cpp b/src/shared/cplusplus/Bind.cpp
index 3517b51b9dfa48b121e92d4403a13b1ae72287fe..ef95d898f9a007cf1d418f65e853abe446cef3e6 100644
--- a/src/shared/cplusplus/Bind.cpp
+++ b/src/shared/cplusplus/Bind.cpp
@@ -1224,7 +1224,7 @@ bool Bind::visit(ForeachStatementAST *ast)
     Block *block = control()->newBlock(ast->firstToken());
     const unsigned startScopeToken = ast->lparen_token ? ast->lparen_token : ast->firstToken();
     block->setStartOffset(tokenAt(startScopeToken).end());
-    block->setEndOffset(tokenAt(ast->lastToken() - 1).end());
+    block->setEndOffset(tokenAt(ast->lastToken()).begin());
     _scope->addMember(block);
     ast->symbol = block;
 
@@ -1244,8 +1244,8 @@ bool Bind::visit(ForeachStatementAST *ast)
         block->addMember(decl);
     }
 
-    ExpressionTy initializer = this->expression(ast->initializer);
-    ExpressionTy expression = this->expression(ast->expression);
+    /*ExpressionTy initializer =*/ this->expression(ast->initializer);
+    /*ExpressionTy expression =*/ this->expression(ast->expression);
     this->statement(ast->statement);
     (void) switchScope(previousScope);
     return false;
@@ -1256,15 +1256,15 @@ bool Bind::visit(ForStatementAST *ast)
     Block *block = control()->newBlock(ast->firstToken());
     const unsigned startScopeToken = ast->lparen_token ? ast->lparen_token : ast->firstToken();
     block->setStartOffset(tokenAt(startScopeToken).end());
-    block->setEndOffset(tokenAt(ast->lastToken() - 1).end());
+    block->setEndOffset(tokenAt(ast->lastToken()).begin());
     _scope->addMember(block);
     ast->symbol = block;
 
     Scope *previousScope = switchScope(block);
     this->statement(ast->initializer);
-    ExpressionTy condition = this->expression(ast->condition);
+    /*ExpressionTy condition =*/ this->expression(ast->condition);
     // unsigned semicolon_token = ast->semicolon_token;
-    ExpressionTy expression = this->expression(ast->expression);
+    /*ExpressionTy expression =*/ this->expression(ast->expression);
     // unsigned rparen_token = ast->rparen_token;
     this->statement(ast->statement);
     (void) switchScope(previousScope);
@@ -1276,12 +1276,12 @@ bool Bind::visit(IfStatementAST *ast)
     Block *block = control()->newBlock(ast->firstToken());
     const unsigned startScopeToken = ast->lparen_token ? ast->lparen_token : ast->firstToken();
     block->setStartOffset(tokenAt(startScopeToken).end());
-    block->setEndOffset(tokenAt(ast->lastToken() - 1).end());
+    block->setEndOffset(tokenAt(ast->lastToken()).begin());
     _scope->addMember(block);
     ast->symbol = block;
 
     Scope *previousScope = switchScope(block);
-    ExpressionTy condition = this->expression(ast->condition);
+    /*ExpressionTy condition =*/ this->expression(ast->condition);
     this->statement(ast->statement);
     this->statement(ast->else_statement);
     (void) switchScope(previousScope);
@@ -1332,12 +1332,12 @@ bool Bind::visit(SwitchStatementAST *ast)
     Block *block = control()->newBlock(ast->firstToken());
     const unsigned startScopeToken = ast->lparen_token ? ast->lparen_token : ast->firstToken();
     block->setStartOffset(tokenAt(startScopeToken).end());
-    block->setEndOffset(tokenAt(ast->lastToken() - 1).end());
+    block->setEndOffset(tokenAt(ast->lastToken()).begin());
     _scope->addMember(block);
     ast->symbol = block;
 
     Scope *previousScope = switchScope(block);
-    ExpressionTy condition = this->expression(ast->condition);
+    /*ExpressionTy condition =*/ this->expression(ast->condition);
     this->statement(ast->statement);
     (void) switchScope(previousScope);
     return false;
@@ -1358,7 +1358,7 @@ bool Bind::visit(CatchClauseAST *ast)
     Block *block = control()->newBlock(ast->firstToken());
     const unsigned startScopeToken = ast->lparen_token ? ast->lparen_token : ast->firstToken();
     block->setStartOffset(tokenAt(startScopeToken).end());
-    block->setEndOffset(tokenAt(ast->lastToken() - 1).end());
+    block->setEndOffset(tokenAt(ast->lastToken()).begin());
     _scope->addMember(block);
     ast->symbol = block;
 
@@ -1375,12 +1375,12 @@ bool Bind::visit(WhileStatementAST *ast)
     Block *block = control()->newBlock(ast->firstToken());
     const unsigned startScopeToken = ast->lparen_token ? ast->lparen_token : ast->firstToken();
     block->setStartOffset(tokenAt(startScopeToken).end());
-    block->setEndOffset(tokenAt(ast->lastToken() - 1).end());
+    block->setEndOffset(tokenAt(ast->lastToken()).begin());
     _scope->addMember(block);
     ast->symbol = block;
 
     Scope *previousScope = switchScope(block);
-    ExpressionTy condition = this->expression(ast->condition);
+    /*ExpressionTy condition =*/ this->expression(ast->condition);
     this->statement(ast->statement);
     (void) switchScope(previousScope);
     return false;
@@ -1391,7 +1391,7 @@ bool Bind::visit(ObjCFastEnumerationAST *ast)
     Block *block = control()->newBlock(ast->firstToken());
     const unsigned startScopeToken = ast->lparen_token ? ast->lparen_token : ast->firstToken();
     block->setStartOffset(tokenAt(startScopeToken).end());
-    block->setEndOffset(tokenAt(ast->lastToken() - 1).end());
+    block->setEndOffset(tokenAt(ast->lastToken()).begin());
     _scope->addMember(block);
     ast->symbol = block;
 
@@ -1410,8 +1410,8 @@ bool Bind::visit(ObjCFastEnumerationAST *ast)
         block->addMember(decl);
     }
 
-    ExpressionTy initializer = this->expression(ast->initializer);
-    ExpressionTy fast_enumeratable_expression = this->expression(ast->fast_enumeratable_expression);
+    /*ExpressionTy initializer =*/ this->expression(ast->initializer);
+    /*ExpressionTy fast_enumeratable_expression =*/ this->expression(ast->fast_enumeratable_expression);
     this->statement(ast->statement);
     (void) switchScope(previousScope);
     return false;
@@ -2825,10 +2825,10 @@ bool Bind::visit(ReferenceAST *ast)
 // PostfixAST
 bool Bind::visit(CallAST *ast)
 {
-    ExpressionTy base_expression = this->expression(ast->base_expression);
+    /*ExpressionTy base_expression =*/ this->expression(ast->base_expression);
     // unsigned lparen_token = ast->lparen_token;
     for (ExpressionListAST *it = ast->expression_list; it; it = it->next) {
-        ExpressionTy value = this->expression(it->value);
+        /*ExpressionTy value =*/ this->expression(it->value);
     }
     // unsigned rparen_token = ast->rparen_token;
     return false;
@@ -2836,9 +2836,9 @@ bool Bind::visit(CallAST *ast)
 
 bool Bind::visit(ArrayAccessAST *ast)
 {
-    ExpressionTy base_expression = this->expression(ast->base_expression);
+    /*ExpressionTy base_expression =*/ this->expression(ast->base_expression);
     // unsigned lbracket_token = ast->lbracket_token;
-    ExpressionTy expression = this->expression(ast->expression);
+    /*ExpressionTy expression =*/ this->expression(ast->expression);
     // unsigned rbracket_token = ast->rbracket_token;
     return false;
 }
@@ -2899,7 +2899,7 @@ bool Bind::visit(FunctionDeclaratorAST *ast)
     this->trailingReturnType(ast->trailing_return_type, type);
     if (ast->as_cpp_initializer != 0) {
         fun->setAmbiguous(true);
-        ExpressionTy as_cpp_initializer = this->expression(ast->as_cpp_initializer);
+        /*ExpressionTy as_cpp_initializer =*/ this->expression(ast->as_cpp_initializer);
     }
     ast->symbol = fun;
     _type = type;
diff --git a/src/tools/cplusplus/generate-ast.cpp b/src/tools/cplusplus/generate-ast.cpp
index 00d57ec18c1962490549df4d8213923856825dd6..27e5d451fbd489897d8e9e95ea023015934f92b4 100644
--- a/src/tools/cplusplus/generate-ast.cpp
+++ b/src/tools/cplusplus/generate-ast.cpp
@@ -982,7 +982,7 @@ static QString createConstructor(ClassSpecifierAST *classAST)
 
 bool checkGenerated(const QTextCursor &cursor, int *doxyStart)
 {
-    BackwardsScanner tokens(cursor);
+    BackwardsScanner tokens(cursor, 10, QString(), false);
     Token prevToken = tokens.LA(1);
     if (prevToken.kind() != T_DOXY_COMMENT && prevToken.kind() != T_CPP_DOXY_COMMENT)
         return false;
@@ -1048,7 +1048,7 @@ void generateLastToken(QTextStream &os, const QString &className, const QStringL
         }
     }
 
-    os << "    return 0;" << endl;
+    os << "    return 1;" << endl;
     os << "}" << endl << endl;
 }
 
@@ -1122,6 +1122,7 @@ void generateAST_cpp(const Snapshot &snapshot, const QDir &cplusplusDir)
                 const int start = cpp_document.findBlockByNumber(line - 1).position() + column - 1;
                 cursor.setPosition(start);
                 int doxyStart = start;
+
                 const bool isGenerated = checkGenerated(cursor, &doxyStart);
 
                 AST_cpp_document->translationUnit()->getTokenEndPosition(funDef->lastToken() - 1, &line, &column);