aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorMartin Sebor <msebor@redhat.com>2016-05-13 20:55:26 +0000
committerMartin Sebor <msebor@gcc.gnu.org>2016-05-13 14:55:26 -0600
commit653fb4a289f340c37c18432ae50971b0be7f5ed8 (patch)
tree517906003b4aad8cb885a9e4984cf5b7eeb8d2db /gcc
parent6eaba1b066d5a7e6628cb1f83d8c3ffa43df0e10 (diff)
downloadgcc-653fb4a289f340c37c18432ae50971b0be7f5ed8.zip
gcc-653fb4a289f340c37c18432ae50971b0be7f5ed8.tar.gz
gcc-653fb4a289f340c37c18432ae50971b0be7f5ed8.tar.bz2
c++/60049 - Right and left shift undefined behavior not an error in a constexpr
Add new test. From-SVN: r236225
Diffstat (limited to 'gcc')
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/constexpr-60049.C24
2 files changed, 29 insertions, 0 deletions
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 5f3ff4d..7ef0797 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2016-05-13 Martin Sebor <msebor@redhat.com>
+
+ PR c++/60049
+ * g++.dg/cpp0x/constexpr-60049.C: New test.
+
2016-05-13 Jakub Jelinek <jakub@redhat.com>
PR bootstrap/71071
diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-60049.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-60049.C
new file mode 100644
index 0000000..3a1ee81
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-60049.C
@@ -0,0 +1,24 @@
+// PR c++/60049 - Right and left shift undefined behavior not an error
+// in a constexpr
+// { dg-do compile { target c++11 } }
+// { dg-additional-options "-Wno-shift-negative-value -Wno-shift-count-negative -Wno-shift-count-overflow" }
+
+constexpr int f1 (int n) { return 1 << n; } // { dg-error "shift expression" }
+constexpr int f2 (int n) { return 1 << n; } // { dg-error "shift expression" }
+constexpr int f3 (int n) { return n << 1; } // { dg-error "shift expression" }
+constexpr int f4 (int n) { return 1 >> n; } // { dg-error "shift expression" }
+constexpr int f5 (int n) { return 1 >> n; } // { dg-error "shift expression" }
+
+constexpr int X = __CHAR_BIT__ * sizeof (int) + 1;
+
+constexpr int x1 = f1 (X);
+constexpr int x2 = f2 (-1);
+constexpr int x3 = f3 (-1);
+constexpr int x4 = f4 (X);
+constexpr int x5 = f5 (-1);
+
+constexpr int y1 = 1 << X; // { dg-error "shift expression" }
+constexpr int y2 = 1 << -1; // { dg-error "shift expression" }
+constexpr int y3 = -1 << 1; // { dg-error "shift expression" }
+constexpr int y4 = 1 >> X; // { dg-error "shift expression" }
+constexpr int y5 = 1 >> -1; // { dg-error "shift expression" }