else if (TREE_CODE (cindex) == INTEGER_CST
&& compare_tree_int (cindex, end - 1) == 0)
{
- if (i < end)
- return i;
tree value = (*elts)[end - 1].value;
- if (TREE_CODE (value) == RAW_DATA_CST
- && wi::to_offset (dindex) < (wi::to_offset (cindex)
- + RAW_DATA_LENGTH (value)))
+ if (i < end)
+ {
+ if (i == end - 1 && TREE_CODE (value) == RAW_DATA_CST)
+ begin = end - 1;
+ else
+ return i;
+ }
+ else if (TREE_CODE (value) == RAW_DATA_CST
+ && wi::to_offset (dindex) < (wi::to_offset (cindex)
+ + RAW_DATA_LENGTH (value)))
begin = end - 1;
else
begin = end;
--- /dev/null
+// PR c++/118534
+// { dg-do compile { target c++14 } }
+// { dg-options "" }
+
+template<typename T>
+constexpr bool
+foo ()
+{
+ T x[160] = {
+#embed __FILE__ limit (160)
+ };
+ const int y[160] = {
+ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
+#embed __FILE__ limit (147) gnu::offset (13)
+ };
+ unsigned long n = 13;
+ for (T *p = x; n; --n, p++)
+ *p = 42;
+ for (int i = 0; i < 160; ++i)
+ if (x[i] != y[i])
+ return false;
+ return true;
+}
+
+int
+main ()
+{
+ static_assert (foo<int> (), "");
+ static_assert (foo<unsigned char> (), "");
+}
--- /dev/null
+// PR c++/118534
+// { dg-do compile { target c++14 } }
+
+template<typename T>
+constexpr bool
+foo ()
+{
+ T x[160] = {
+#define I8 1, 2, 3, 4, 5, 6, 7, 8
+#define I64 I8, I8, I8, I8, I8, I8, I8, I8
+ I64, I64, I8, I8, I8, I8
+ };
+ const int y[160] = {
+ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 6, 7, 8,
+ I64, I64, I8, I8
+ };
+ unsigned long n = 13;
+ for (T *p = x; n; --n, p++)
+ *p = 42;
+ for (int i = 0; i < 160; ++i)
+ if (x[i] != y[i])
+ return false;
+ return true;
+}
+
+int
+main ()
+{
+ static_assert (foo<int> (), "");
+ static_assert (foo<unsigned char> (), "");
+}