applying your patch to trunk and build the whole C::B.
Than I do the following steps:
1, open the project
F:\cb\codeblocks_trunk\src\plugins\codecompletion\parser\parsertest.cbp
2, edit the file "test.h"
to below:
aaa & f();
aaa const & g();
3, run the project, here is the log:
...
--------------L-i-s-t--L-o-g--------------
000055. function aaa & f()	[9,0]
000056. function aaa const & g()	[11,0]
it seems the log is correctly.
Note that the List log comes from: parsertest.cpp
void ParserTest::PrintList()
{
    TokenList& tokens = m_tokensTree->m_Tokens;
    for (TokenList::iterator it = tokens.begin(); it != tokens.end(); it++)
    {
        wxString log;
        log << (*it)->GetTokenKindString() << _T(" ") << (*it)->DisplayName() << _T("\t[") << (*it)->m_Line;
        log << _T(",") << (*it)->m_ImplLine << _T("]");
        ParserTrace(log);
    }
}
then, DisplayName() will internally call the function:
wxString Token::DisplayName() const
{
    wxString result;
    if      (m_TokenKind == tkClass)
        return result << _T("class ")     << m_Name << m_BaseArgs << _T(" {...}");
    else if (m_TokenKind == tkNamespace)
        return result << _T("namespace ") << m_Name << _T(" {...}");
    else if (m_TokenKind == tkEnum)
        return result << _T("enum ")      << m_Name << _T(" {...}");
    else if (m_TokenKind == tkTypedef)
    {
        result << _T("typedef");
        if (!m_Type.IsEmpty())
            result << _T(" ") << m_Type;
        if (result.Find('*', true) != wxNOT_FOUND)
        {
            result.RemoveLast();
            return result << m_Name << _T(")") <<  GetFormattedArgs();
        }
        if (!m_TemplateArgument.IsEmpty())
            result << m_TemplateArgument;
        return result << _T(" ") << m_Name;
    }
    else if (m_TokenKind == tkPreprocessor)
    {
        result << _T("#define ") << m_Name << GetFormattedArgs();
        if (!m_Type.IsEmpty())
            return result << _T(" ") << m_Type;
    }
    // else
    if (!m_Type.IsEmpty())
        result << m_Type << m_TemplateArgument << _T(" ");
    if (m_TokenKind == tkEnumerator)
        return result << GetNamespace() << m_Name << _T("=") << GetFormattedArgs();
    return result << GetNamespace() << m_Name << GetStrippedArgs();
}
Then, I check the 
m_Type here, it is correct too.
not sure why your problem happens....