diff options
author | Paolo Carlini <paolo@gcc.gnu.org> | 2014-12-15 16:16:29 +0000 |
---|---|---|
committer | Paolo Carlini <paolo@gcc.gnu.org> | 2014-12-15 16:16:29 +0000 |
commit | 6bfb1253a46494591e0e5073dd08ed30d184e867 (patch) | |
tree | d0e50a626b6c10c71461ed44a9cd555e72700f32 /gcc | |
parent | d06790a0b2e733c39033a32d00fa522ecb0308b1 (diff) | |
download | gcc-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/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/cp/decl.c | 14 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 11 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/desig1.C | 27 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/ext/desig8.C | 3 |
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" } |