diff --git a/src/plugins/cppeditor/cppchecksymbols.cpp b/src/plugins/cppeditor/cppchecksymbols.cpp
index 0e9af30b3929eb46b3fcdd4473bfffa497c47a78..635ddb6285c5da6971667e7b6f979d6b435a1f54 100644
--- a/src/plugins/cppeditor/cppchecksymbols.cpp
+++ b/src/plugins/cppeditor/cppchecksymbols.cpp
@@ -268,6 +268,8 @@ CheckSymbols::CheckSymbols(Document::Ptr doc, const LookupContext &context)
     CollectTypes collectTypes(doc, context.snapshot());
     _potentialTypes = collectTypes.types();
     _scopes = collectTypes.scopes();
+    _flushRequested = false;
+    _flushLine = 0;
 }
 
 CheckSymbols::~CheckSymbols()
@@ -473,10 +475,16 @@ void CheckSymbols::endVisit(TemplateDeclarationAST *)
 
 void CheckSymbols::addTypeUsage(const Use &use)
 {
-    _typeUsages.append(use);
+    if (_typeUsages.size() >= 50) {
+        if (_flushRequested && use.line != _flushLine)
+            flush();
+        else if (! _flushRequested) {
+            _flushRequested = true;
+            _flushLine = use.line;
+        }
+    }
 
-    if (_typeUsages.size() == 50)
-        flush();
+    _typeUsages.append(use);
 }
 
 void CheckSymbols::addTypeUsage(ClassOrNamespace *b, NameAST *ast)
@@ -563,6 +571,9 @@ Scope *CheckSymbols::findScope(AST *ast) const
 
 void CheckSymbols::flush()
 {
+    _flushRequested = false;
+    _flushLine = 0;
+
     if (_typeUsages.isEmpty())
         return;
 
diff --git a/src/plugins/cppeditor/cppchecksymbols.h b/src/plugins/cppeditor/cppchecksymbols.h
index 1e5d74c1b3246dd45032ab5b77168a5111d47dfb..876132ab3f42adb5357b0799269602cdf36ff0d1 100644
--- a/src/plugins/cppeditor/cppchecksymbols.h
+++ b/src/plugins/cppeditor/cppchecksymbols.h
@@ -119,6 +119,8 @@ private:
     QList<ScopedSymbol *> _scopes;
     QList<TemplateDeclarationAST *> _templateDeclarationStack;
     QVector<Use> _typeUsages;
+    bool _flushRequested;
+    unsigned _flushLine;
 };
 
 } // end of namespace CPlusPlus