blob: c0aed241086bdeeb1c17d0da519baa270780271a [file] [log] [blame]
// { 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 <stdlib.h>
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<iApm>(0);
struct AD : A {};
int AD::* gp_impl = gp_dflt;
int AD::* gp_down = static_cast<int AD::*>(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 ();
}