diff --git a/src/plugins/cpptools/cppcodecompletion.cpp b/src/plugins/cpptools/cppcodecompletion.cpp
index bc1d1d4ad724dda56c979ba264e018c19044c4ec..ada7f48ab77396daabe653ec96ed41eaa4cad3f1 100644
--- a/src/plugins/cpptools/cppcodecompletion.cpp
+++ b/src/plugins/cpptools/cppcodecompletion.cpp
@@ -988,10 +988,7 @@ bool CppCodeCompletion::completeMember(const QList<TypeOfExpression::Result> &re
     QList<Symbol *> classObjectCandidates;
 
     if (m_completionOperator == T_ARROW)  {
-        FullySpecifiedType ty = result.first;
-
-        if (ReferenceType *refTy = ty->asReferenceType())
-            ty = refTy->elementType();
+        FullySpecifiedType ty = result.first.simplified();
 
         if (Class *classTy = ty->asClassType()) {
             Symbol *symbol = result.second;
@@ -1026,10 +1023,7 @@ bool CppCodeCompletion::completeMember(const QList<TypeOfExpression::Result> &re
                     if (! funTy)
                         continue;
 
-                    ty = funTy->returnType();
-
-                    if (ReferenceType *refTy = ty->asReferenceType())
-                        ty = refTy->elementType();
+                    ty = funTy->returnType().simplified();
 
                     if (PointerType *ptrTy = ty->asPointerType()) {
                         if (NamedType *namedTy = ptrTy->elementType()->asNamedType()) {
@@ -1063,19 +1057,13 @@ bool CppCodeCompletion::completeMember(const QList<TypeOfExpression::Result> &re
             }
         }
     } else if (m_completionOperator == T_DOT) {
-        FullySpecifiedType ty = result.first;
-
-        if (ReferenceType *refTy = ty->asReferenceType())
-            ty = refTy->elementType();
+        FullySpecifiedType ty = result.first.simplified();
 
         NamedType *namedTy = 0;
 
         if (ArrayType *arrayTy = ty->asArrayType()) {
             // Replace . with [0]. when `ty' is an array type.
-            FullySpecifiedType elementTy = arrayTy->elementType();
-
-            if (ReferenceType *refTy = elementTy->asReferenceType())
-                elementTy = refTy->elementType();
+            FullySpecifiedType elementTy = arrayTy->elementType().simplified();
 
             if (elementTy->isNamedType() || elementTy->isPointerType()) {
                 ty = elementTy;
@@ -1322,9 +1310,8 @@ bool CppCodeCompletion::completeQtMethod(const QList<TypeOfExpression::Result> &
 
     QSet<QString> signatures;
     foreach (const TypeOfExpression::Result &p, results) {
-        FullySpecifiedType ty = p.first;
-        if (ReferenceType *refTy = ty->asReferenceType())
-            ty = refTy->elementType();
+        FullySpecifiedType ty = p.first.simplified();
+
         if (PointerType *ptrTy = ty->asPointerType())
             ty = ptrTy->elementType();
         else
diff --git a/src/shared/cplusplus/FullySpecifiedType.cpp b/src/shared/cplusplus/FullySpecifiedType.cpp
index 410541ac0cfef67b2e9f846fe3764c9ef95cc8e7..58711ac8a96b3b4ab8b10c8f9f652132bf085e1f 100644
--- a/src/shared/cplusplus/FullySpecifiedType.cpp
+++ b/src/shared/cplusplus/FullySpecifiedType.cpp
@@ -201,4 +201,12 @@ bool FullySpecifiedType::operator < (const FullySpecifiedType &other) const
     return _type < other._type;
 }
 
+FullySpecifiedType FullySpecifiedType::simplified() const
+{
+    if (const ReferenceType *refTy = type()->asReferenceType())
+        return refTy->elementType().simplified();
+
+    return *this;
+}
+
 CPLUSPLUS_END_NAMESPACE
diff --git a/src/shared/cplusplus/FullySpecifiedType.h b/src/shared/cplusplus/FullySpecifiedType.h
index 4cd4db797124bccd650469ce1482fbee3d6667e1..b9a1c3fa3976dd99cea744ffa831f3fb0e96ac4b 100644
--- a/src/shared/cplusplus/FullySpecifiedType.h
+++ b/src/shared/cplusplus/FullySpecifiedType.h
@@ -119,6 +119,8 @@ public:
     bool operator != (const FullySpecifiedType &other) const;
     bool operator < (const FullySpecifiedType &other) const;
 
+    FullySpecifiedType simplified() const;
+
 private:
     Type *_type;
     struct Flags {