diff --git a/src/plugins/cpptools/cppcodecompletion.cpp b/src/plugins/cpptools/cppcodecompletion.cpp
index 1be7e4100126411a5ddd1a5ee725e88fe66736ba..2bdaa6445f632d134fcb720235b83d1f80c18d61 100644
--- a/src/plugins/cpptools/cppcodecompletion.cpp
+++ b/src/plugins/cpptools/cppcodecompletion.cpp
@@ -1209,10 +1209,7 @@ void CppCodeCompletion::complete(const TextEditor::CompletionItem &item)
             if (Function *function = symbol->type()->asFunctionType()) {
                 // If the member is a function, automatically place the opening parenthesis,
                 // except when it might take template parameters.
-                const bool hasReturnType = function->returnType().isValid()  ||
-                                           function->returnType().isSigned() ||
-                                           function->returnType().isUnsigned();
-                if (! hasReturnType && (function->identity() && !function->identity()->isDestructorNameId())) {
+                if (! function->hasReturnType() && (function->identity() && !function->identity()->isDestructorNameId())) {
                     // Don't insert any magic, since the user might have just wanted to select the class
 
                 } else if (function->templateParameterCount() != 0) {
@@ -1224,9 +1221,7 @@ void CppCodeCompletion::complete(const TextEditor::CompletionItem &item)
                     extraChars += QLatin1Char('(');
 
                     // If the function takes no arguments, automatically place the closing parenthesis
-                    if (item.m_duplicateCount == 0 && (function->argumentCount() == 0 ||
-                                                       (function->argumentCount() == 1 &&
-                                                        function->argumentAt(0)->type()->isVoidType()))) {
+                    if (item.m_duplicateCount == 0 && ! function->hasArguments()) {
                         extraChars += QLatin1Char(')');
 
                         // If the function doesn't return anything, automatically place the semicolon,
diff --git a/src/shared/cplusplus/Symbols.cpp b/src/shared/cplusplus/Symbols.cpp
index 5185aa82659a8fd1f5e6897f21abfeab6cc4a5d0..10b82664c345aeb94648a55049d010e2246fcd72 100644
--- a/src/shared/cplusplus/Symbols.cpp
+++ b/src/shared/cplusplus/Symbols.cpp
@@ -217,6 +217,12 @@ FullySpecifiedType Function::returnType() const
 void Function::setReturnType(FullySpecifiedType returnType)
 { _returnType = returnType; }
 
+bool Function::hasReturnType() const
+{
+    const FullySpecifiedType ty = returnType();
+    return ty.isValid() || ty.isSigned() || ty.isUnsigned();
+}
+
 unsigned Function::argumentCount() const
 {
     if (! _arguments)
@@ -231,6 +237,12 @@ Symbol *Function::argumentAt(unsigned index) const
 Scope *Function::arguments() const
 { return _arguments; }
 
+bool Function::hasArguments() const
+{
+    return ! (argumentCount() == 0 ||
+              (argumentCount() == 1 && argumentAt(0)->type()->isVoidType()));
+}
+
 bool Function::isVariadic() const
 { return _isVariadic; }
 
diff --git a/src/shared/cplusplus/Symbols.h b/src/shared/cplusplus/Symbols.h
index 8efc0fbdbed0c104a843564817f77520b8131223..4052b746da29517391db21158a6db0cef77a60bc 100644
--- a/src/shared/cplusplus/Symbols.h
+++ b/src/shared/cplusplus/Symbols.h
@@ -288,10 +288,16 @@ public:
     FullySpecifiedType returnType() const;
     void setReturnType(FullySpecifiedType returnType);
 
+    /** Convenience function that returns whether the function returns something (including void). */
+    bool hasReturnType() const;
+
     unsigned argumentCount() const;
     Symbol *argumentAt(unsigned index) const;
     Scope *arguments() const;
 
+    /** Convenience function that returns whether the function receives any arguments. */
+    bool hasArguments() const;
+
     bool isVariadic() const;
     void setVariadic(bool isVariadic);