mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-04-15 22:21:20 +08:00
PR c++/99074 - crash in dynamic_cast<>() on null pointer
libstdc++-v3/ChangeLog: PR c++/99074 * libsupc++/dyncast.cc (__dynamic_cast): Return null when first argument is null. gcc/testsuite/ChangeLog: PR c++/99074 * g++.dg/warn/Wnonnull11.C: New test.
This commit is contained in:
parent
29a5298955
commit
6d134ca4b9
40
gcc/testsuite/g++.dg/warn/Wnonnull11.C
Normal file
40
gcc/testsuite/g++.dg/warn/Wnonnull11.C
Normal file
@ -0,0 +1,40 @@
|
||||
/* PR c++/99074 - gcc 8 and above is crashing with dynamic_cast<>() on null
|
||||
pointer with optimization level -O1 and above
|
||||
{ dg-do run }
|
||||
{ dg-options "-O1 -Wall" } */
|
||||
|
||||
class Base
|
||||
{
|
||||
public:
|
||||
virtual ~Base() {}
|
||||
virtual void op() = 0;
|
||||
};
|
||||
|
||||
class Object: public virtual Base { };
|
||||
|
||||
class AbstractBase: public virtual Base
|
||||
{
|
||||
public:
|
||||
Object* _to_object ()
|
||||
{
|
||||
return dynamic_cast<Object*>(this); // { dg-warning "\\\[-Wnonnull" "" { xfail *-*-* } }
|
||||
}
|
||||
};
|
||||
|
||||
class MyAbstractClass: public virtual AbstractBase
|
||||
{
|
||||
public:
|
||||
static MyAbstractClass* _nil () { return 0; }
|
||||
};
|
||||
|
||||
|
||||
int main ()
|
||||
{
|
||||
MyAbstractClass *my_abs_type = MyAbstractClass::_nil ();
|
||||
AbstractBase *abs_base = my_abs_type;
|
||||
Object *obj = abs_base->_to_object ();
|
||||
|
||||
__builtin_printf ("object is: %p\n", obj);
|
||||
|
||||
return 0;
|
||||
}
|
@ -47,6 +47,9 @@ __dynamic_cast (const void *src_ptr, // object started from
|
||||
const __class_type_info *dst_type, // desired target type
|
||||
ptrdiff_t src2dst) // how src and dst are related
|
||||
{
|
||||
if (!src_ptr)
|
||||
/* Handle precondition violations gracefully. */
|
||||
return NULL;
|
||||
const void *vtable = *static_cast <const void *const *> (src_ptr);
|
||||
const vtable_prefix *prefix =
|
||||
(adjust_pointer <vtable_prefix>
|
||||
|
Loading…
x
Reference in New Issue
Block a user