summaryrefslogtreecommitdiff
path: root/gcc/testsuite/g++.dg/cpp0x/constexpr-neg1.C
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/testsuite/g++.dg/cpp0x/constexpr-neg1.C')
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/constexpr-neg1.C69
1 files changed, 69 insertions, 0 deletions
diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-neg1.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-neg1.C
new file mode 100644
index 000000000..8294afa98
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-neg1.C
@@ -0,0 +1,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 "" }