aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite/g++.dg/cpp2a/constexpr-union3.C
blob: 6d30bb2498f7fcbfa2556fafd0f42121f2c579b6 (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
// { dg-do compile { target c++20 } }

struct S
{
  union {
    char buf[8];
    char* ptr;
  };
  unsigned len;

  constexpr S(const char* s, unsigned n)
  {
    char* p;
    if (n > 7)
      p = ptr = new char[n+1];
    else
      p = buf;
    for (len = 0; len < n; ++len)
      p[len] = s[len];  // { dg-error "accessing uninitialized member" }
    p[len] = '\0';
  }

  constexpr ~S()
  {
    if (len > 7)
      delete[] ptr;
  }
};

constexpr bool test1()
{
  S s("test", 4);  // { dg-message "in .constexpr. expansion" }
  return true;
}

constexpr bool a = test1();  // { dg-message "in .constexpr. expansion" }


constexpr bool test2()
{
  S s("hello world", 11);
  return true;
}

constexpr bool b = test2();