1117395Skan// { dg-do run }
2169689Skan
3169689Skan// Copyright 2002  Free Software Foundation
490075Sobrien// Contributed by Jason Merrill and Alexandre Oliva
590075Sobrien
690075Sobrien// Test zero-initialization of pointers to data members.  Their NULL
790075Sobrien// value is represented with -1, not 0.
890075Sobrien
990075Sobrien#include <stdlib.h>
1090075Sobrien
1190075Sobrienstruct A
1290075Sobrien{
1390075Sobrien  int i;
1490075Sobrien};
1590075Sobrien
1690075Sobrienint A::* gp;
1790075Sobrien
1890075Sobrientypedef int A::* iApm;
1990075Sobrien
20169689SkaniApm gp_zero = 0;
21169689SkaniApm gp_dflt = iApm();
2290075SobrieniApm gp_cast = (iApm)0;
2390075SobrieniApm gp_func = iApm(0);
2490075SobrieniApm gp_stat = static_cast<iApm>(0);
2590075Sobrien
2690075Sobrienstruct AD : A {};
2790075Sobrien
2890075Sobrienint AD::* gp_impl = gp_dflt;
2990075Sobrienint AD::* gp_down = static_cast<int AD::*>(gp_stat);
3090075Sobrien
31132718Skanint A::* ga[2];
32132718Skan
3390075Sobrien// Test use in a simple struct.
34169689Skanstruct B
3590075Sobrien{
3690075Sobrien  int A::* mp;
3790075Sobrien};
3890075Sobrien
3990075SobrienB gb;
4090075Sobrien
41117395Skanstruct D;
42117395Skanstruct C;
43169689Skanextern D gd;
4490075Sobrienextern C gc;
4590075Sobrien
4690075Sobrien// Test that in a class with a constructor, the pointer to member is
47132718Skan// zero-initialized until the constructor is run.
4890075Sobrienstruct C
49132718Skan{
50132718Skan  int A::* mp;
51132718Skan  inline C ();
52132718Skan};
5390075Sobrien
54132718Skanint fail;
55132718Skanstruct D
56132718Skan{
57132718Skan  int count;
58132718Skan  inline D ();
59132718Skan};
6090075Sobrien
6190075SobrienC::C() : mp (&A::i) { gd.count++; }
6290075Sobrien
6390075SobrienD::D() : count (0)
6490075Sobrien{
6590075Sobrien  if (gc.mp != 0)
66132718Skan    abort ();
67132718Skan}
6890075Sobrien
69132718Skan// The D must come first for this to work.
7090075SobrienD gd;
7190075SobrienC gc;
72132718Skan
7390075Sobrienint main()
74132718Skan{
7590075Sobrien  static int A::* slp;
76132718Skan  static int A::* sla[2];
7790075Sobrien  static B slb;
7890075Sobrien
7990075Sobrien  if (gp != 0 || slp != 0
8090075Sobrien      || gp_zero != 0 || gp_dflt != 0 || gp_cast != 0
81132718Skan      || gp_func != 0 || gp_stat != 0
8290075Sobrien      || gp_impl != 0 || gp_down != 0)
83132718Skan    abort ();
8490075Sobrien  if (ga[1] != 0 || sla[1] != 0)
8590075Sobrien    abort ();
8690075Sobrien  if (gb.mp != 0 || slb.mp != 0)
8790075Sobrien    abort ();
8890075Sobrien}
89117395Skan