aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite/g++.dg/init/array52.C
blob: e7b4cb394ad21ad45d2a38ef4ccb1a5e1b975f14 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
// PR c++/89980 - pointer initialization with empty string folded to zero
// { dg-do compile }
// { dg-options "-O2 -Wall -fdump-tree-optimized" }

#if __cplusplus >= 201103L

#define SA(e) static_assert (e, #e)

static constexpr const char* const ca1[2] = { "" };

void fca1 (void)
{
  SA (ca1[0] && ca1[0][0] == 0 && ca1[1] == 0);
}

static constexpr const char* const ca2[][2] =
{
  { }, { 0 }, { 0, 0 }, { "" }, { "", "" }, { "", 0 }, { 0, "" }
};

void fca2 (void)
{
  SA (ca2[0][0] == 0 && ca2[0][1] == 0);
  SA (ca2[1][0] == 0 && ca2[1][1] == 0);
  SA (ca2[2][0] == 0 && ca2[2][1] == 0);

  SA (ca2[3][0] && ca2[3][0][0] == 0 && ca2[3][1] == 0);
  SA (ca2[4][0] && ca2[4][0][0] == 0 && ca2[4][1] && ca2[4][1][0] == 0);
  SA (ca2[5][0] && ca2[5][0][0] == 0 && ca2[5][1] == 0);
  SA (ca2[6][0] == 0 && ca2[6][1] && ca2[6][1][0] == 0);
}

struct A
{
  const char *p;
  char a[2];
};

static constexpr A ca3[] =
{
  {  }, { 0 }, { 0, "" }, { "" }, { "", "" }
};

void fca3 (void)
{
  SA (ca3[0].p == 0 && ca3[0].a[0] == 0 && ca3[0].a[1] == 0);
  SA (ca3[1].p == 0 && ca3[1].a[0] == 0 && ca3[1].a[1] == 0);
  SA (ca3[2].p == 0 && ca3[2].a[0] == 0 && ca3[2].a[1] == 0);
  SA (ca3[3].p && ca3[3].p[0] == 0 && ca3[3].a[0] == 0 && ca3[3].a[1] == 0);
  SA (ca3[4].p && ca3[4].p[0] == 0 && ca3[4].a[0] == 0 && ca3[4].a[1] == 0);
}

#endif   // C++ 11 and above


#define A(e) ((e) ? (void)0 : __builtin_abort ())

static const char* const a1[2] = { "" };

void fa1 (void)
{
  A (a1[0] && a1[0][0] == 0 && a1[1] == 0);
}

static const char* const a2[][2] =
{
  { }, { 0 }, { 0, 0 }, { "" }, { "", "" }, { "", 0 }, { 0, "" }
};

void fa2 (void)
{
  A (a2[0][0] == 0 && a2[0][1] == 0);
  A (a2[1][0] == 0 && a2[1][1] == 0);
  A (a2[2][0] == 0 && a2[2][1] == 0);

  A (a2[3][0] && a2[3][0][0] == 0 && a2[3][1] == 0);
  A (a2[4][0] && a2[4][0][0] == 0 && a2[4][1] && a2[4][1][0] == 0);
  A (a2[5][0] && a2[5][0][0] == 0 && a2[5][1] == 0);
  A (a2[6][0] == 0 && a2[6][1] && a2[6][1][0] == 0);
}

struct B
{
  const char *p;
  char a[2];
};

static const B a3[] =
{
  {  }, { 0 }, { 0, "" }, { "" }, { "", "" }
};

void fa3 (void)
{
  A (a3[0].p == 0 && a3[0].a[0] == 0 && a3[0].a[1] == 0);
  A (a3[1].p == 0 && a3[1].a[0] == 0 && a3[1].a[1] == 0);
  A (a3[2].p == 0 && a3[2].a[0] == 0 && a3[2].a[1] == 0);
  A (a3[3].p && a3[3].p[0] == 0 && a3[3].a[0] == 0 && a3[3].a[1] == 0);
  A (a3[4].p && a3[4].p[0] == 0 && a3[4].a[0] == 0 && a3[4].a[1] == 0);
}