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