summaryrefslogtreecommitdiff
path: root/gcc/testsuite/g++.dg/cpp0x/constexpr-neg1.C
blob: 8294afa98373f1142600a9f4f9d0ee7e1c7c7484 (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
// Negative examples from N3092 (FCD)
// { dg-options -std=c++0x }

// OK: declaration
constexpr int square(int x);	// { dg-message "never defined" }

// error: pixel is a type
constexpr struct pixel {
  int x;
  int y;
  // OK: declaration
  constexpr pixel(int);
};				// { dg-error "constexpr" }
constexpr pixel::pixel(int a)
// OK: definition
  : x(square(a)), y(square(a))	// { dg-error "square" }
{ }

// error: square not defined, so small(2) not constant (5.19), so constexpr
// not satisfied
constexpr pixel small(2);	// { dg-message "in constexpr expansion" }

// error: not for parameters
int next(constexpr int x) {	// { dg-error "parameter" }
  return x + 1;
}

// error: not a definition
extern constexpr int memsz;	// { dg-error "definition" }

// error: return type is void
constexpr void f(int x)		// { dg-error "void" }
{ /* ... */ }
// error: use of decrement
constexpr int prev(int x)
{ return --x; }			// { dg-error "-- x" }

// error: body not just return expr
constexpr int g(int x, int n) {
  int r = 1;
  while (--n > 0) r *= x;
  return r;
} // { dg-error "body of constexpr function" }

class debug_flag {
public:
  explicit debug_flag(bool);
  constexpr bool is_on();	// { dg-error "not a literal type" } debug_flag not literal type
private:
  bool flag;
};
// OK
constexpr int bar(int x, int y) // { dg-error "previously defined here" }
{ return x + y + x*y; }
// ...
// error: redefinition of bar
int bar(int x, int y)		// { dg-error "redefinition" }
{ return x * 2 + 3 * y; }

struct pixel2 {	   // { dg-message "no user-provided default constructor" }
  int x, y;
};
constexpr pixel2 ur = { 1294, 1024 };// OK
constexpr pixel2 origin;	     // { dg-error "uninitialized const" }

constexpr const int* addr(const int& ir) { return &ir; } // OK

// error, initializer for constexpr variable not a constant
extern constexpr const int* tp = addr(5); // { dg-error "" }