Viewing file: pm1.C (1.35 KB) -rw-r--r-- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
// { 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 (); }
|