aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorPaolo Carlini <paolo@gcc.gnu.org>2014-12-15 16:16:29 +0000
committerPaolo Carlini <paolo@gcc.gnu.org>2014-12-15 16:16:29 +0000
commit6bfb1253a46494591e0e5073dd08ed30d184e867 (patch)
treed0e50a626b6c10c71461ed44a9cd555e72700f32 /gcc
parentd06790a0b2e733c39033a32d00fa522ecb0308b1 (diff)
downloadgcc-6bfb1253a46494591e0e5073dd08ed30d184e867.zip
gcc-6bfb1253a46494591e0e5073dd08ed30d184e867.tar.gz
gcc-6bfb1253a46494591e0e5073dd08ed30d184e867.tar.bz2
re PR c++/58882 (ICE with invalid C99 style designated initializers)
/cp 2014-12-15 Paolo Carlini <paolo.carlini@oracle.com> PR c++/58882 * decl.c (check_array_designated_initializer): Diagnose gracefully C99 designators which aren't integral constant-expressions; allow constexpr user-defined type conversion operators. /testsuite 2014-12-15 Paolo Carlini <paolo.carlini@oracle.com> PR c++/58882 * g++.dg/ext/desig8.C: New. * g++.dg/cpp0x/desig1.C: Likewise. From-SVN: r218752
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog7
-rw-r--r--gcc/cp/decl.c14
-rw-r--r--gcc/testsuite/ChangeLog11
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/desig1.C27
-rw-r--r--gcc/testsuite/g++.dg/ext/desig8.C3
5 files changed, 55 insertions, 7 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 576610d..4eb762c9 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,10 @@
+2014-12-15 Paolo Carlini <paolo.carlini@oracle.com>
+
+ PR c++/58882
+ * decl.c (check_array_designated_initializer): Diagnose gracefully
+ C99 designators which aren't integral constant-expressions; allow
+ constexpr user-defined type conversion operators.
+
2014-12-12 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/59628
diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
index 5ed9b2c..d478652 100644
--- a/gcc/cp/decl.c
+++ b/gcc/cp/decl.c
@@ -4996,18 +4996,22 @@ check_array_designated_initializer (constructor_elt *ce,
return false;
}
- ce->index = cxx_constant_value (ce->index);
-
- if (TREE_CODE (ce->index) == INTEGER_CST)
+ tree ce_index = build_expr_type_conversion (WANT_INT | WANT_ENUM,
+ ce->index, true);
+ if (ce_index
+ && INTEGRAL_OR_UNSCOPED_ENUMERATION_TYPE_P (TREE_TYPE (ce_index))
+ && (TREE_CODE (ce_index = maybe_constant_value (ce_index))
+ == INTEGER_CST))
{
/* A C99 designator is OK if it matches the current index. */
- if (wi::eq_p (ce->index, index))
+ if (wi::eq_p (ce_index, index))
return true;
else
sorry ("non-trivial designated initializers not supported");
}
else
- gcc_unreachable ();
+ error ("C99 designator %qE is not an integral constant-expression",
+ ce->index);
return false;
}
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 808f5a2..75e15d0 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,9 @@
+2014-12-15 Paolo Carlini <paolo.carlini@oracle.com>
+
+ PR c++/58882
+ * g++.dg/ext/desig8.C: New.
+ * g++.dg/cpp0x/desig1.C: Likewise.
+
2014-12-15 Janus Weil <janus@gcc.gnu.org>
PR fortran/63727
@@ -23,8 +29,9 @@
instead of %e in regexps trying to match 32-bit GPR.
* gcc.target/i386/avx512f-vpbroadcastd-1.c: Likewise.
* gcc.target/i386/avx512vl-vpbroadcastd-1.c: Likewise.
- * gcc.target/i386/avx512vl-vmovdqa64-1.c: Restrict some scan-assembler-times
- lines to nonpic targets only. Fix up \[^\n^x^y\] to \[^\nxy\].
+ * gcc.target/i386/avx512vl-vmovdqa64-1.c: Restrict some
+ scan-assembler-times lines to nonpic targets only.
+ Fix up \[^\n^x^y\] to \[^\nxy\].
2014-12-15 Paolo Carlini <paolo.carlini@oracle.com>
diff --git a/gcc/testsuite/g++.dg/cpp0x/desig1.C b/gcc/testsuite/g++.dg/cpp0x/desig1.C
new file mode 100644
index 0000000..cc52730
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp0x/desig1.C
@@ -0,0 +1,27 @@
+// PR c++/58882
+// { dg-do compile { target c++11 } }
+
+struct A
+{
+ constexpr operator int() const { return 0; }
+};
+
+int a[] = { [A()] = 0 };
+
+enum E { e0 };
+
+struct B
+{
+ constexpr operator E() const { return E::e0; }
+};
+
+int b[] = { [B()] = 0 };
+
+enum class SE { se0 };
+
+struct C
+{
+ constexpr operator SE() const { return SE::se0; }
+};
+
+int c[] = { [C()] = 0 }; // { dg-error "integral constant-expression" }
diff --git a/gcc/testsuite/g++.dg/ext/desig8.C b/gcc/testsuite/g++.dg/ext/desig8.C
new file mode 100644
index 0000000..98e7bfd
--- /dev/null
+++ b/gcc/testsuite/g++.dg/ext/desig8.C
@@ -0,0 +1,3 @@
+// PR c++/58882
+
+int a[] = { [0.] = 0 }; // { dg-error "integral constant-expression" }