diff --git a/src/libs/cplusplus/SimpleLexer.h b/src/libs/cplusplus/SimpleLexer.h
index 3359358e73e4f627e573247e605b331df7a2b890..0366738c6bdb9a91841ae40f2fad69bd559979e1 100644
--- a/src/libs/cplusplus/SimpleLexer.h
+++ b/src/libs/cplusplus/SimpleLexer.h
@@ -56,6 +56,12 @@ public:
     inline int length() const
     { return _length; }
 
+    inline int begin() const
+    { return _position; }
+
+    inline int end() const
+    { return _position + _length; }
+
     inline QStringRef text() const
     { return _text; }
 
diff --git a/src/libs/cplusplus/TokenUnderCursor.cpp b/src/libs/cplusplus/TokenUnderCursor.cpp
index a819007828e29407fda6c0fcd8bb05173c1a1296..997c1e6e3aae3045421117a291db5ed0cc4d4aa9 100644
--- a/src/libs/cplusplus/TokenUnderCursor.cpp
+++ b/src/libs/cplusplus/TokenUnderCursor.cpp
@@ -42,7 +42,7 @@ TokenUnderCursor::TokenUnderCursor()
 TokenUnderCursor::~TokenUnderCursor()
 { }
 
-SimpleToken TokenUnderCursor::operator()(const QTextCursor &cursor, QTextBlock *b) const
+SimpleToken TokenUnderCursor::operator()(const QTextCursor &cursor, QTextBlock *b)
 {
     SimpleLexer tokenize;
     tokenize.setObjCEnabled(true);
@@ -51,9 +51,9 @@ SimpleToken TokenUnderCursor::operator()(const QTextCursor &cursor, QTextBlock *
     QTextBlock block = cursor.block();
     int column = cursor.columnNumber();
 
-    QList<SimpleToken> tokens = tokenize(block.text(), previousBlockState(block));
-    for (int index = tokens.size() - 1; index != -1; --index) {
-        const SimpleToken &tk = tokens.at(index);
+    _tokens = tokenize(block.text(), previousBlockState(block));
+    for (int index = _tokens.size() - 1; index != -1; --index) {
+        const SimpleToken &tk = _tokens.at(index);
         if (tk.position() < column) {
             if (b)
                 *b = block;
diff --git a/src/libs/cplusplus/TokenUnderCursor.h b/src/libs/cplusplus/TokenUnderCursor.h
index 93199d2b3821a0a4ca06ddc8af4ab3b0e36c2a64..536beac5691afdd89172828e3aba910963721c1a 100644
--- a/src/libs/cplusplus/TokenUnderCursor.h
+++ b/src/libs/cplusplus/TokenUnderCursor.h
@@ -40,18 +40,21 @@ QT_END_NAMESPACE
 
 namespace CPlusPlus {
 
-class SimpleToken;
-
 class CPLUSPLUS_EXPORT TokenUnderCursor
 {
 public:
     TokenUnderCursor();
     ~TokenUnderCursor();
 
-    SimpleToken operator()(const QTextCursor &cursor, QTextBlock *block = 0) const;
+    SimpleToken operator()(const QTextCursor &cursor, QTextBlock *block = 0);
+
+    const QList<SimpleToken> &tokens() const
+    { return _tokens; }
 
 private:
     int previousBlockState(const QTextBlock &block) const;
+
+    QList<SimpleToken> _tokens;
 };
 
 } // end of namespace CPlusPlus
diff --git a/src/plugins/cpptools/cppcodecompletion.cpp b/src/plugins/cpptools/cppcodecompletion.cpp
index 84994e78b62c71da1ee8df2a22e9e766e91df5fa..211ec084e693e814a73e603a703a068f526c9454 100644
--- a/src/plugins/cpptools/cppcodecompletion.cpp
+++ b/src/plugins/cpptools/cppcodecompletion.cpp
@@ -514,6 +514,26 @@ static int startOfOperator(TextEditor::ITextEditable *editor,
         start = pos;
     }
 
+    if (k == T_LPAREN) {
+        const QList<SimpleToken> &tokens = tokenUnderCursor.tokens();
+        int i = 0;
+        for (; i < tokens.size(); ++i) {
+            const SimpleToken &token = tokens.at(i);
+            if (token.position() == tk.position()) {
+                if (i == 0) // no token on the left, but might be on a previous line
+                    break;
+                const SimpleToken &previousToken = tokens.at(i - 1);
+                if (previousToken.is(T_IDENTIFIER) || previousToken.is(T_GREATER))
+                    break;
+            }
+        }
+
+        if (i == tokens.size()) {
+            k = T_EOF_SYMBOL;
+            start = pos;
+        }
+    }
+
     if (kind)
         *kind = k;