diff --git a/src/plugins/cpptools/cppcodecompletion.cpp b/src/plugins/cpptools/cppcodecompletion.cpp
index 9815b6f2c1622f9c4bec20ba1277ecef0d93a0bd..382ff50b2b565b47e0a57854a247656cbb9594d2 100644
--- a/src/plugins/cpptools/cppcodecompletion.cpp
+++ b/src/plugins/cpptools/cppcodecompletion.cpp
@@ -512,22 +512,21 @@ int CppCodeCompletion::startCompletion(TextEditor::ITextEditable *editor)
             context = typeOfExpression.lookupContext();
         }
 
-        if (! resolvedTypes.isEmpty() && resolvedTypes.first().first) {
-            FullySpecifiedType exprTy = resolvedTypes.first().first;
-
-            if (exprTy->isReferenceType())
-                exprTy = exprTy->asReferenceType()->elementType();
-
-            if (m_completionOperator == T_LPAREN && completeConstructorOrFunction(exprTy, resolvedTypes)) {
+        if (! resolvedTypes.isEmpty()) {
+            if (m_completionOperator == T_LPAREN && completeConstructorOrFunction(resolvedTypes)) {
                 return m_startPosition;
+
             } else if ((m_completionOperator == T_DOT || m_completionOperator == T_ARROW) &&
                       completeMember(resolvedTypes, context)) {
                 return m_startPosition;
+
             } else if (m_completionOperator == T_COLON_COLON && completeScope(resolvedTypes, context)) {
                 return m_startPosition;
-            } else if (m_completionOperator == T_SIGNAL && completeSignal(exprTy, resolvedTypes, context)) {
+
+            } else if (m_completionOperator == T_SIGNAL      && completeSignal(resolvedTypes, context)) {
                 return m_startPosition;
-            } else if (m_completionOperator == T_SLOT && completeSlot(exprTy, resolvedTypes, context)) {
+
+            } else if (m_completionOperator == T_SLOT        && completeSlot(resolvedTypes, context)) {
                 return m_startPosition;
             }
         }
@@ -550,8 +549,7 @@ int CppCodeCompletion::startCompletion(TextEditor::ITextEditable *editor)
             // If it's a class, add completions for the constructors
             foreach (const TypeOfExpression::Result &result, results) {
                 if (result.first->isClassType()) {
-                    FullySpecifiedType exprTy = result.first;
-                    if (completeConstructorOrFunction(exprTy, QList<TypeOfExpression::Result>()))
+                    if (completeConstructorOrFunction(results))
                         return m_startPosition;
                     break;
                 }
@@ -563,32 +561,41 @@ int CppCodeCompletion::startCompletion(TextEditor::ITextEditable *editor)
     return -1;
 }
 
-bool CppCodeCompletion::completeConstructorOrFunction(FullySpecifiedType exprTy,
-                                                      const QList<TypeOfExpression::Result> &resolvedTypes)
+bool CppCodeCompletion::completeConstructorOrFunction(const QList<TypeOfExpression::Result> &results)
 {
     ConvertToCompletionItem toCompletionItem(this);
     Overview o;
     o.setShowReturnTypes(true);
     o.setShowArgumentNames(true);
 
-    if (Class *klass = exprTy->asClassType()) {
-        for (unsigned i = 0; i < klass->memberCount(); ++i) {
-            Symbol *member = klass->memberAt(i);
-            if (! member->type()->isFunctionType())
-                continue;
-            else if (! member->identity())
-                continue;
-            else if (! member->identity()->isEqualTo(klass->identity()))
-                continue;
-            if (TextEditor::CompletionItem item = toCompletionItem(member)) {
-                item.m_text = o(member->type(), member->name());
-                m_completions.append(item);
+    foreach (const TypeOfExpression::Result &result, results) {
+        FullySpecifiedType exprTy = result.first;
+
+        if (Class *klass = exprTy->asClassType()) {
+            for (unsigned i = 0; i < klass->memberCount(); ++i) {
+                Symbol *member = klass->memberAt(i);
+                if (! member->type()->isFunctionType())
+                    continue;
+                else if (! member->identity())
+                    continue;
+                else if (! member->identity()->isEqualTo(klass->identity()))
+                    continue;
+                if (TextEditor::CompletionItem item = toCompletionItem(member)) {
+                    item.m_text = o(member->type(), member->name());
+                    m_completions.append(item);
+                }
             }
+
+            break;
         }
-    } else {
+    }
+
+    if (m_completions.isEmpty()) {
         QSet<QString> signatures;
-        foreach (TypeOfExpression::Result p, resolvedTypes) {
+
+        foreach (const TypeOfExpression::Result &p, results) {
             FullySpecifiedType ty = p.first;
+
             if (Function *fun = ty->asFunctionType()) {
                 if (TextEditor::CompletionItem item = toCompletionItem(fun)) {
                     QString signature;
@@ -819,33 +826,45 @@ void CppCodeCompletion::addKeywords()
 
 void CppCodeCompletion::addMacros(const LookupContext &context)
 {
-    // macro completion items.
-    QSet<QByteArray> macroNames;
     QSet<QString> processed;
-    QList<QString> todo;
-    todo.append(context.thisDocument()->fileName());
-    while (! todo.isEmpty()) {
-        QString fn = todo.last();
-        todo.removeLast();
-        if (processed.contains(fn))
-            continue;
-        processed.insert(fn);
-        if (Document::Ptr doc = context.document(fn)) {
-            foreach (const Macro &macro, doc->definedMacros()) {
-                macroNames.insert(macro.name());
-            }
-            todo += doc->includedFiles();
-        }
-    }
+    QSet<QString> definedMacros;
+
+    addMacros_helper(context, context.thisDocument()->fileName(),
+                     &processed, &definedMacros);
 
-    foreach (const QByteArray &macroName, macroNames) {
+    foreach (const QString &macroName, definedMacros) {
         TextEditor::CompletionItem item(this);
-        item.m_text = QString::fromUtf8(macroName.constData(), macroName.length());
+        item.m_text = macroName;
         item.m_icon = m_icons.macroIcon();
         m_completions.append(item);
     }
 }
 
+void CppCodeCompletion::addMacros_helper(const LookupContext &context,
+                                         const QString &fileName,
+                                         QSet<QString> *processed,
+                                         QSet<QString> *definedMacros)
+{
+    Document::Ptr doc = context.document(fileName);
+
+    if (! doc || processed->contains(doc->fileName()))
+        return;
+
+    processed->insert(doc->fileName());
+
+    foreach (const Document::Include &i, doc->includes()) {
+        addMacros_helper(context, i.fileName(), processed, definedMacros);
+    }
+
+    foreach (const Macro &macro, doc->definedMacros()) {
+        const QString macroName = QString::fromUtf8(macro.name().constData(), macro.name().length());
+        if (! macro.isHidden())
+            definedMacros->insert(macroName);
+        else
+            definedMacros->remove(macroName);
+    }
+}
+
 void CppCodeCompletion::addCompletionItem(Symbol *symbol)
 {
     ConvertToCompletionItem toCompletionItem(this);
@@ -902,8 +921,7 @@ void CppCodeCompletion::completeClass(const QList<Symbol *> &candidates,
     }
 }
 
-bool CppCodeCompletion::completeQtMethod(CPlusPlus::FullySpecifiedType,
-                                         const QList<TypeOfExpression::Result> &results,
+bool CppCodeCompletion::completeQtMethod(const QList<TypeOfExpression::Result> &results,
                                          const LookupContext &context,
                                          bool wantSignals)
 {
@@ -919,7 +937,7 @@ bool CppCodeCompletion::completeQtMethod(CPlusPlus::FullySpecifiedType,
     o.setShowFunctionSignatures(true);
 
     QSet<QString> signatures;
-    foreach (TypeOfExpression::Result p, results) {
+    foreach (const TypeOfExpression::Result &p, results) {
         FullySpecifiedType ty = p.first;
         if (ReferenceType *refTy = ty->asReferenceType())
             ty = refTy->elementType();
diff --git a/src/plugins/cpptools/cppcodecompletion.h b/src/plugins/cpptools/cppcodecompletion.h
index 79f580236f9f50cba34befdec1dc261e8b646d6f..4e257ed674e9f57e877e0e0ee32d81887d252c0b 100644
--- a/src/plugins/cpptools/cppcodecompletion.h
+++ b/src/plugins/cpptools/cppcodecompletion.h
@@ -84,10 +84,13 @@ public:
 private:
     void addKeywords();
     void addMacros(const CPlusPlus::LookupContext &context);
+    void addMacros_helper(const CPlusPlus::LookupContext &context,
+                          const QString &fileName,
+                          QSet<QString> *processed,
+                          QSet<QString> *definedMacros);
     void addCompletionItem(CPlusPlus::Symbol *symbol);
 
-    bool completeConstructorOrFunction(CPlusPlus::FullySpecifiedType exprTy,
-                                       const QList<CPlusPlus::TypeOfExpression::Result> &);
+    bool completeConstructorOrFunction(const QList<CPlusPlus::TypeOfExpression::Result> &);
 
     bool completeMember(const QList<CPlusPlus::TypeOfExpression::Result> &,
                         const CPlusPlus::LookupContext &context);
@@ -104,20 +107,17 @@ private:
 
     bool completeConstructors(CPlusPlus::Class *klass);
 
-    bool completeQtMethod(CPlusPlus::FullySpecifiedType exprTy,
-                          const QList<CPlusPlus::TypeOfExpression::Result> &,
+    bool completeQtMethod(const QList<CPlusPlus::TypeOfExpression::Result> &,
                           const CPlusPlus::LookupContext &context,
                           bool wantSignals);
 
-    bool completeSignal(CPlusPlus::FullySpecifiedType exprTy,
-                        const QList<CPlusPlus::TypeOfExpression::Result> &results,
+    bool completeSignal(const QList<CPlusPlus::TypeOfExpression::Result> &results,
                         const CPlusPlus::LookupContext &context)
-    { return completeQtMethod(exprTy, results, context, true); }
+    { return completeQtMethod(results, context, true); }
 
-    bool completeSlot(CPlusPlus::FullySpecifiedType exprTy,
-                      const QList<CPlusPlus::TypeOfExpression::Result> &results,
+    bool completeSlot(const QList<CPlusPlus::TypeOfExpression::Result> &results,
                       const CPlusPlus::LookupContext &context)
-    { return completeQtMethod(exprTy, results, context, false); }
+    { return completeQtMethod(results, context, false); }
 
     int findStartOfName(int pos = -1) const;
 
diff --git a/src/plugins/debugger/gdbengine.cpp b/src/plugins/debugger/gdbengine.cpp
index 4c01fb756ead5ee3cd1b782465080641e5d3e95b..a310fd69a1a1ac0b858b66e7886e234aea5fda03 100644
--- a/src/plugins/debugger/gdbengine.cpp
+++ b/src/plugins/debugger/gdbengine.cpp
@@ -1130,7 +1130,7 @@ void GdbEngine::handleAsyncOutput(const GdbMi &data)
         sendCommand("info proc", GdbInfoProc);
         #endif
         #if defined(Q_OS_MAC)
-        sendCommand("info pid", GdbInfoProc, QVariant(), true);
+        sendCommand("info pid", GdbInfoProc);
         #endif
         reloadSourceFiles();
         tryLoadCustomDumpers();
diff --git a/src/shared/cplusplus/CheckSpecifier.cpp b/src/shared/cplusplus/CheckSpecifier.cpp
index fddfd525689a439a4b5a1e9d51cdf62be16ee7a5..d345e41ba9c65bce02b384947251d2067daa1fa9 100644
--- a/src/shared/cplusplus/CheckSpecifier.cpp
+++ b/src/shared/cplusplus/CheckSpecifier.cpp
@@ -388,8 +388,9 @@ bool CheckSpecifier::visit(TypeofSpecifierAST *ast)
     return false;
 }
 
-bool CheckSpecifier::visit(AttributeSpecifierAST *)
+bool CheckSpecifier::visit(AttributeSpecifierAST *ast)
 {
+    accept(ast->next);
     return false;
 }