1 /* PR c++/94510 - nullptr_t implicitly cast to zero twice in std::array
2    { dg-do compile { target c++2a } }
3    { dg-options "-Wall" } */
4 
5 struct A { int i; int f (); };
6 typedef int A::*MemPtr;
7 typedef int (A::*MemFuncPtr)();
8 
9 struct B { MemPtr a[3]; MemFuncPtr b[3]; };
10 
11 static const constexpr MemPtr mp0 = { 0 };
12 static const constexpr MemPtr mpn = { nullptr };
13 static const constexpr MemPtr mp_ = { };
14 static const constexpr MemPtr mpi = { &A::i };
15 
16 template <B> struct X { };
17 
18 typedef X<B{ }>                               XB;
19 typedef X<B{ 0 }>                             XB;
20 typedef X<B{{ 0 }}>                           XB;
21 typedef X<B{{ MemPtr{ }}}>                    XB;
22 typedef X<B{{ MemPtr{ 0 }}}>                  XB;
23 typedef X<B{{ MemPtr () }}>                   XB;
24 typedef X<B{{ MemPtr{ nullptr }}}>            XB;
25 typedef X<B{{ mp_ }}>                         XB;
26 typedef X<B{{ mpn }}>                         XB;
27 typedef X<B{{ mp0 }}>                         XB;
28 
29 typedef X<B{ mpi }>                           XBp;
30 typedef X<B{ mpi, 0 }>                        XBp;
31 typedef X<B{{ mpi, 0 }}>                      XBp;
32 typedef X<B{{ mpi, MemPtr{ }}}>               XBp;
33 typedef X<B{{ mpi, MemPtr{ 0 }}}>             XBp;
34 typedef X<B{{ mpi, MemPtr () }}>              XBp;
35 typedef X<B{{ mpi, MemPtr{ nullptr }}}>       XBp;
36 typedef X<B{{ mpi, mp_ }}>                    XBp;
37 typedef X<B{{ mpi, mpn }}>                    XBp;
38 typedef X<B{{ mpi, mp0 }}>                    XBp;
39 
40 typedef X<B{ mpi, mpi }>                      XBpp;
41 typedef X<B{ mpi, mpi, 0 }>                   XBpp;
42 typedef X<B{{ mpi, mpi, 0 }}>                 XBpp;
43 typedef X<B{{ mpi, mpi, MemPtr{ }}}>          XBpp;
44 typedef X<B{{ mpi, mpi, MemPtr{ 0 }}}>        XBpp;
45 typedef X<B{{ mpi, mpi, MemPtr () }}>         XBpp;
46 typedef X<B{{ mpi, mpi, MemPtr{ nullptr }}}>  XBpp;
47 typedef X<B{{ mpi, mpi, mp_ }}>               XBpp;
48 typedef X<B{{ mpi, mpi, mpn }}>               XBpp;
49 typedef X<B{{ mpi, mpi, mp0 }}>               XBpp;
50 
51 typedef X<B{ 0, mpi }>                        XB0p;
52 typedef X<B{ nullptr, mpi, 0 }>               XB0p;
53 typedef X<B{ mp0, mpi, 0 }>                   XB0p;
54 
55 typedef X<B{ 0, 0, mpi }>                     XB00p;
56 typedef X<B{ 0, nullptr, mpi }>               XB00p;
57 typedef X<B{ nullptr, 0, mpi }>               XB00p;
58 typedef X<B{ nullptr, nullptr, mpi }>         XB00p;
59 typedef X<B{ MemPtr{ }, MemPtr{ }, mpi }>     XB00p;
60 typedef X<B{ mp0, MemPtr{ }, mpi }>           XB00p;
61 typedef X<B{ mpn, mpn, mpi }>                 XB00p;
62 typedef X<B{ mpn, mp_, mpi }>                 XB00p;  // { dg-bogus "conflicting declaration" "pr94568" { xfail *-*-* } }
63 
64 static const constexpr MemFuncPtr mfp0 = { 0 };
65 static const constexpr MemFuncPtr mfpn = { nullptr };
66 static const constexpr MemFuncPtr mfp_ = { };
67 
68 typedef X<B{{ }, { }}>                        XB;
69 typedef X<B{{ }, { 0 }}>                      XB;
70 typedef X<B{{ }, { MemFuncPtr{ }}}>           XB;
71 typedef X<B{{ }, { MemFuncPtr{ 0 }}}>         XB;
72 typedef X<B{{ }, { MemFuncPtr () }}>          XB;
73 typedef X<B{{ }, { MemFuncPtr{ nullptr }}}>   XB;
74 typedef X<B{{ }, { mfp_ }}>                   XB;
75 typedef X<B{{ }, { mfpn }}>                   XB;
76 typedef X<B{{ }, { mfp0 }}>                   XB;
77