From 6bfb1253a46494591e0e5073dd08ed30d184e867 Mon Sep 17 00:00:00 2001 From: Paolo Carlini Date: Mon, 15 Dec 2014 16:16:29 +0000 Subject: [PATCH] re PR c++/58882 (ICE with invalid C99 style designated initializers) /cp 2014-12-15 Paolo Carlini 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 PR c++/58882 * g++.dg/ext/desig8.C: New. * g++.dg/cpp0x/desig1.C: Likewise. From-SVN: r218752 --- gcc/cp/ChangeLog | 7 +++++++ gcc/cp/decl.c | 14 +++++++++----- gcc/testsuite/ChangeLog | 11 +++++++++-- gcc/testsuite/g++.dg/cpp0x/desig1.C | 27 +++++++++++++++++++++++++++ gcc/testsuite/g++.dg/ext/desig8.C | 3 +++ 5 files changed, 55 insertions(+), 7 deletions(-) create mode 100644 gcc/testsuite/g++.dg/cpp0x/desig1.C create mode 100644 gcc/testsuite/g++.dg/ext/desig8.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 576610deed0..4eb762c91ab 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,10 @@ +2014-12-15 Paolo Carlini + + 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 PR c++/59628 diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 5ed9b2c216a..d47865287a8 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 808f5a2ccde..75e15d034c7 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2014-12-15 Paolo Carlini + + PR c++/58882 + * g++.dg/ext/desig8.C: New. + * g++.dg/cpp0x/desig1.C: Likewise. + 2014-12-15 Janus Weil 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 diff --git a/gcc/testsuite/g++.dg/cpp0x/desig1.C b/gcc/testsuite/g++.dg/cpp0x/desig1.C new file mode 100644 index 00000000000..cc527308f0d --- /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 00000000000..98e7bfdca46 --- /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" } -- 2.30.2