diff --git a/src/plugins/cppeditor/cppquickfix_test.cpp b/src/plugins/cppeditor/cppquickfix_test.cpp index 90193516fc8..1b226ce4ed8 100644 --- a/src/plugins/cppeditor/cppquickfix_test.cpp +++ b/src/plugins/cppeditor/cppquickfix_test.cpp @@ -1416,7 +1416,35 @@ void CppEditorPlugin::test_quickfix_data() QTest::newRow("ConvertToPointer_noTriggerRValueRefs") << CppQuickFixFactoryPtr(new ConvertFromAndToPointer) << _("void foo(Narf &&@narf) {}\n") - << _("void foo(Narf &&@narf) {}\n"); + << _(); + + QTest::newRow("ConvertToPointer_noTriggerGlobal") + << CppQuickFixFactoryPtr(new ConvertFromAndToPointer) + << _("int @global;\n") + << _(); + + QTest::newRow("ConvertToPointer_noTriggerClassMember") + << CppQuickFixFactoryPtr(new ConvertFromAndToPointer) + << _("struct C { int @member; };\n") + << _(); + + QTest::newRow("ConvertToPointer_noTriggerClassMember2") + << CppQuickFixFactoryPtr(new ConvertFromAndToPointer) + << _("void f() { struct C { int @member; }; }\n") + << _(); + + QTest::newRow("ConvertToPointer_functionOfFunctionLocalClass") + << CppQuickFixFactoryPtr(new ConvertFromAndToPointer) + << _("void f() {\n" + " struct C {\n" + " void g() { int @member; }\n" + " };\n" + "}\n") + << _("void f() {\n" + " struct C {\n" + " void g() { int *member; }\n" + " };\n" + "}\n"); QTest::newRow("ConvertToPointer_redeclaredVariable_block") << CppQuickFixFactoryPtr(new ConvertFromAndToPointer) diff --git a/src/plugins/cppeditor/cppquickfixes.cpp b/src/plugins/cppeditor/cppquickfixes.cpp index f00a5afd4b0..0165339b5a0 100644 --- a/src/plugins/cppeditor/cppquickfixes.cpp +++ b/src/plugins/cppeditor/cppquickfixes.cpp @@ -4152,15 +4152,25 @@ void ConvertFromAndToPointer::match(const CppQuickFixInterface &interface, return; SimpleDeclarationAST *simpleDeclaration = 0; DeclaratorAST *declarator = 0; + bool isFunctionLocal = false; + bool isClassLocal = false; ConvertFromAndToPointerOp::Mode mode = ConvertFromAndToPointerOp::FromVariable; for (int i = path.count() - 2; i >= 0; --i) { AST *ast = path.at(i); if (!declarator && (declarator = ast->asDeclarator())) continue; - else if (!simpleDeclaration && (simpleDeclaration = ast->asSimpleDeclaration())) + if (!simpleDeclaration && (simpleDeclaration = ast->asSimpleDeclaration())) continue; + if (declarator && simpleDeclaration) { + if (ast->asClassSpecifier()) { + isClassLocal = true; + } else if (ast->asFunctionDefinition() && !isClassLocal) { + isFunctionLocal = true; + break; + } + } } - if (!simpleDeclaration || !declarator) + if (!isFunctionLocal || !simpleDeclaration || !declarator) return; Symbol *symbol = 0;