diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 67fb3b1c28e..9602bf0742d 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2002-05-14 Jason Merrill , Alexandre Oliva + + * g++.dg/init/pm1.C: New test. + 2002-05-12 David S. Miller * gcc.c-torture/execute/conversion.c (ldnear): Use long double diff --git a/gcc/testsuite/g++.dg/init/pm1.C b/gcc/testsuite/g++.dg/init/pm1.C new file mode 100644 index 00000000000..c0aed241086 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/pm1.C @@ -0,0 +1,88 @@ +// { dg-do run } + +// Copyright 2002 Free Software Foundation +// Contributed by Jason Merrill and Alexandre Oliva + +// Test zero-initialization of pointers to data members. Their NULL +// value is represented with -1, not 0. + +#include + +struct A +{ + int i; +}; + +int A::* gp; + +typedef int A::* iApm; + +iApm gp_zero = 0; +iApm gp_dflt = iApm(); +iApm gp_cast = (iApm)0; +iApm gp_func = iApm(0); +iApm gp_stat = static_cast(0); + +struct AD : A {}; + +int AD::* gp_impl = gp_dflt; +int AD::* gp_down = static_cast(gp_stat); + +int A::* ga[2]; + +// Test use in a simple struct. +struct B +{ + int A::* mp; +}; + +B gb; + +struct D; +struct C; +extern D gd; +extern C gc; + +// Test that in a class with a constructor, the pointer to member is +// zero-initialized until the constructor is run. +struct C +{ + int A::* mp; + inline C (); +}; + +int fail; +struct D +{ + int count; + inline D (); +}; + +C::C() : mp (&A::i) { gd.count++; } + +D::D() : count (0) +{ + if (gc.mp != 0) + abort (); +} + +// The D must come first for this to work. +D gd; +C gc; + +int main() +{ + static int A::* slp; + static int A::* sla[2]; + static B slb; + + if (gp != 0 || slp != 0 + || gp_zero != 0 || gp_dflt != 0 || gp_cast != 0 + || gp_func != 0 || gp_stat != 0 + || gp_impl != 0 || gp_down != 0) + abort (); + if (ga[1] != 0 || sla[1] != 0) + abort (); + if (gb.mp != 0 || slb.mp != 0) + abort (); +}