------- Comment #2 from mckelvey at maskull dot com  2007-05-25 23:03 -------
Here is how I compile it:

/usr/local/bin/g++ -c -O3 -DNDEBUG -Wuninitialized -pedantic-errors -Werror 
-Winline -ansi -fno-common -Wall -Wold-style-cast -Wsign-promo -Wpointer-arith 
-Wundef -Wwrite-strings -Winvalid-pch -Woverloaded-virtual -Wcast-qual -Wextra 
-Wredundant-decls -Wshadow -Wcast-align -Wcomment -fstrict-aliasing 
-Winit-self -Wmissing-include-dirs -Wswitch-default -Wswitch-enum -Wlogical-op 
-Wunused -fvisibility-inlines-hidden -MMD      
-fimplicit-templates -o CircularlyReferenceable.o CircularlyReferenceable.cc

"froms" is the multiset. The destructor will be called in the normal case.
There
is an exception, but it is thrown before the multiset is even created.

        SeenMultiset froms;

        if (from != PDNULL)
        {
            froms.insert(from);
        }

        // Record we've been seen
        seen_map.insert(std::make_pair(this, froms));

        return true;

The warning points at the seen_map.insert and the return.

Whole member function:

bool CircularlyReferenceable::

_accumulate_delete_candidates(
    const CircularlyReferenceable * const from,
    SeenMap&                              seen_map) const
{
    if (! _is_allocated())
    {
        if (! get_strict())
        {
            return false;
        }

        throw InternalException(_message(_msgtext("Inconsistent reference "
                                                  "count: %s(0)::%s(1)"),
                                         name(),
                                         "_accumulate_delete_candidates"),
                                __FILE__,
                                __LINE__);
    }

    // Get our entry (if there is one)
    const SeenMap::iterator it(seen_map.find(this));

    if (it == seen_map.end())
    {
        // We haven't been seen before; make an entry

        SeenMultiset froms;

        if (from != PDNULL)
        {
            froms.insert(from);
        }

        // Record we've been seen
        seen_map.insert(std::make_pair(this, froms));

        return true;
    }

    // We have been seen before, update the set of pointers to us

    if (from != PDNULL)
    {
        it->second.insert(from);
    }

    return false;
}


-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=32089

Reply via email to