From 07d118dee56b8859d0759da2939b7fb048275936 Mon Sep 17 00:00:00 2001 From: Robert Reif Date: Sat, 29 Dec 2012 08:30:14 +0100 Subject: [PATCH] Fixed #4449 (segfault in CheckClass::initializeVarList()) --- lib/checkclass.cpp | 2 +- test/testconstructors.cpp | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/lib/checkclass.cpp b/lib/checkclass.cpp index 9c585d0b4..97ef95441 100644 --- a/lib/checkclass.cpp +++ b/lib/checkclass.cpp @@ -356,7 +356,7 @@ bool CheckClass::isBaseClassFunc(const Token *tok, const Scope *scope) void CheckClass::initializeVarList(const Function &func, std::list &callstack, const Scope *scope, std::vector &usage) { - bool initList = true; + bool initList = func.type == Function::eConstructor || func.type == Function::eCopyConstructor; const Token *ftok = func.arg->link()->next(); int level = 0; for (; ftok != func.functionScope->classEnd; ftok = ftok->next()) { diff --git a/test/testconstructors.cpp b/test/testconstructors.cpp index 9846970e7..5e4812e25 100644 --- a/test/testconstructors.cpp +++ b/test/testconstructors.cpp @@ -82,6 +82,7 @@ private: TEST_CASE(initvar_nocopy3); // ticket #3611 TEST_CASE(initvar_destructor); // No variables need to be initialized in a destructor + TEST_CASE(initvar_func_ret_func_ptr); // ticket #4449 TEST_CASE(operatorEqSTL); @@ -944,6 +945,14 @@ private: ASSERT_EQUALS("", errout.str()); } + void initvar_func_ret_func_ptr() { // ticket #4449 (segmentation fault) + check("class something {\n" + " int * ( something :: * process()) () { return 0; }\n" + " something() { process(); }\n" + "};\n"); + ASSERT_EQUALS("", errout.str()); + } + void operatorEqSTL() { check("class Fred\n" "{\n"