152
|
1 /* PR c++/94510 - nullptr_t implicitly cast to zero twice in std::array
|
|
2 { dg-do compile { target c++20 } }
|
|
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;
|