Index: doxygen.cpp
===================================================================
--- doxygen.cpp	(revision 58)
+++ doxygen.cpp	(working copy)
@@ -2231,7 +2231,7 @@
 }
 
 
-/*! Returns TRUE iff \a type is a class within scope \a context.
+/*! Returns TRUE if \a type is a class within scope \a context.
  *  Used to detect variable declarations that look like function prototypes.
  */
 static bool isVarWithConstructor(EntryNav *rootNav)
@@ -2239,7 +2239,6 @@
   static QRegExp initChars("[0-9\"'&*!^]+");
   static QRegExp idChars("[a-z_A-Z][a-z_A-Z0-9]*");
   bool result=FALSE;
-  bool typeIsClass;
   QCString type;
   Definition *ctx = 0;
   FileDef *fd = 0;
@@ -2249,6 +2248,9 @@
   rootNav->loadEntry(g_storage);
   Entry *root = rootNav->entry();
 
+  if(root == NULL || rootNav->parent() == NULL)
+      return false;
+
   if (rootNav->parent()->section() & Entry::COMPOUND_MASK)
   { // inside a class
     result=FALSE;
@@ -2275,16 +2277,25 @@
   findAndRemoveWord(type,"const");
   findAndRemoveWord(type,"static");
   findAndRemoveWord(type,"volatile");
-  //if (type.left(6)=="const ") type=type.right(type.length()-6);
-  typeIsClass=getResolvedClass(ctx,fd,type)!=0;
-  if (!typeIsClass && (ti=type.find('<'))!=-1)
-  {
-    typeIsClass=getResolvedClass(ctx,fd,type.left(ti))!=0;
+
+  if(type == "void")
+  { 
+    //only a function may have void type
+    result = FALSE;
+    goto done;
   }
-  if (typeIsClass) // now we still have to check if the arguments are 
-                   // types or values. Since we do not have complete type info
-                   // we need to rely on heuristics :-(
-  {
+
+  /*
+  NOTE: there was some code, which utilized getResolvedClass(), and then some 'if(typeIsClass)' construction.
+  But that code in fact has a following comment:
+  ---
+  Now we still have to check if the arguments are types or values. 
+  Since we do not have complete type info we need to rely on heuristics :-(
+  ---
+  That was a problem: the code just can't detect if it is a class or not, so it 
+  was not only useless but may introduce an error, and it happened in my case (see bug 567474).
+*/
+  
     //printf("typeIsClass\n");
     ArgumentList *al = root->argList;
     if (al==0 || al->isEmpty()) 
@@ -2348,7 +2359,7 @@
       }
     }
     result=TRUE;
-  }
+  
 
 done:
   //printf("isVarWithConstructor(%s,%s)=%d\n",rootNav->parent()->name().data(),
@@ -2793,6 +2804,9 @@
 
 static void buildFunctionList(EntryNav *rootNav)
 {
+    if(isVarWithConstructor(rootNav)) //see bug #567474 for details of this issue
+        return;
+
   if (rootNav->section()==Entry::FUNCTION_SEC)
   {
     rootNav->loadEntry(g_storage);
Index: util.cpp
===================================================================
--- util.cpp	(revision 58)
+++ util.cpp	(working copy)
@@ -1708,24 +1708,32 @@
   //    scope?scope->name().data():"<none>",
   //    fileScope?fileScope->name().data():"<none>",
   //    txtStr.data(),strLen);
-  int matchLen;
-  int index=0;
-  int newIndex;
-  int skipIndex=0;
-  int floatingIndex=0;
-  if (strLen==0) return;
+  if(strLen == 0) 
+      return;
+
+  int matchLen = 0;
+  int index = 0;
+  int newIndex = 0;
+  int skipIndex = 0;
+  int floatingIndex = 0;
+  bool insideString = FALSE; 
   // read a word from the text string
+  //BTW, match() method kinda labelled 'deprecated' and should be replaced by find()... afaik...
   while ((newIndex=regExp.match(txtStr,index,&matchLen))!=-1 && 
       (newIndex==0 || !(txtStr.at(newIndex-1)>='0' && txtStr.at(newIndex-1)<='9')) // avoid matching part of hex numbers
       )
   {
     // add non-word part to the result
     floatingIndex+=newIndex-skipIndex+matchLen;
-    bool insideString=FALSE; 
     int i;
     for (i=index;i<newIndex;i++) 
     { 
-      if (txtStr.at(i)=='"') insideString=!insideString; 
+      //Note that value in insideString is persistent between {while} loops.
+      //That's because of the fact that {index} value is always increased exactly by {matchLen},
+      //thus string reading continues from where it stopped on previous loop, 
+      //not skipping the trailing '"' for string parameters.
+      if (txtStr.at(i)=='"') 
+          insideString = !insideString; 
     }
 
     //printf("floatingIndex=%d strlen=%d autoBreak=%d\n",floatingIndex,strLen,autoBreak);
