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



             Bug #: 56636

           Summary: strange interaction of dynamic_cast and unique_ptr

    Classification: Unclassified

           Product: gcc

           Version: 4.7.2

            Status: UNCONFIRMED

          Severity: normal

          Priority: P3

         Component: c++

        AssignedTo: unassig...@gcc.gnu.org

        ReportedBy: gcc-b...@naturalcleaningcalgary.com





The following program produces a segfault at the dynamic_cast.  If I change

std::unique_ptr<int> to int*, or if I drop the dynamic_cast, the segfault goes

away.





#include <memory>



struct A

{

    void F() const

    {

        F_impl();

    }



    virtual std::unique_ptr<int> F_impl() const = 0;

};



template <typename Derived>

    struct A_impl : virtual A

{

    std::unique_ptr<int> F_impl() const override

    {

        dynamic_cast<const Derived &>(*this);

        return nullptr;

    }

};



struct B : virtual A {};



struct C : B, A_impl<C> {};



int main()

{

    C().F();

}





$ g++ -std=c++11 -otest test.cpp && ./test.exe



I am using GCC 4.7.2 under MinGW, configured with "--enable-libstdcxx-debug

--enable-languages=c,c++ --build=pentium4-pc-mingw32 --disable-nls

--disable-win32-registry --enable-threads".





(gdb) run

Starting program: c:\devel\page\build/test.exe

[New Thread 2356.0xa10]



Program received signal SIGSEGV, Segmentation fault.

__cxxabiv1::__dynamic_cast (src_ptr=0x4031f4, src_type=0x403180,

    dst_type=0x403160, src2dst=4)

    at ../../../../gcc-4.7.2/libstdc++-v3/libsupc++/dyncast.cc:56

56            adjust_pointer <void> (src_ptr, prefix->whole_object);

(gdb) bt

#0  __cxxabiv1::__dynamic_cast (src_ptr=0x4031f4, src_type=0x403180,

    dst_type=0x403160, src2dst=4)

    at ../../../../gcc-4.7.2/libstdc++-v3/libsupc++/dyncast.cc:56

#1  0x00401d04 in A_impl<C>::F_impl() const ()

#2  0x00401cc6 in A::F() const ()

#3  0x00401378 in main ()

Reply via email to