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