Commit 6bfb1253 by Paolo Carlini

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
parent d06790a0
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> 2014-12-12 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/59628 PR c++/59628
......
...@@ -4996,18 +4996,22 @@ check_array_designated_initializer (constructor_elt *ce, ...@@ -4996,18 +4996,22 @@ check_array_designated_initializer (constructor_elt *ce,
return false; return false;
} }
ce->index = cxx_constant_value (ce->index); tree ce_index = build_expr_type_conversion (WANT_INT | WANT_ENUM,
ce->index, true);
if (TREE_CODE (ce->index) == INTEGER_CST) 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. */ /* 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; return true;
else else
sorry ("non-trivial designated initializers not supported"); sorry ("non-trivial designated initializers not supported");
} }
else else
gcc_unreachable (); error ("C99 designator %qE is not an integral constant-expression",
ce->index);
return false; return false;
} }
......
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> 2014-12-15 Janus Weil <janus@gcc.gnu.org>
PR fortran/63727 PR fortran/63727
...@@ -23,8 +29,9 @@ ...@@ -23,8 +29,9 @@
instead of %e in regexps trying to match 32-bit GPR. instead of %e in regexps trying to match 32-bit GPR.
* gcc.target/i386/avx512f-vpbroadcastd-1.c: Likewise. * gcc.target/i386/avx512f-vpbroadcastd-1.c: Likewise.
* gcc.target/i386/avx512vl-vpbroadcastd-1.c: Likewise. * gcc.target/i386/avx512vl-vpbroadcastd-1.c: Likewise.
* gcc.target/i386/avx512vl-vmovdqa64-1.c: Restrict some scan-assembler-times * gcc.target/i386/avx512vl-vmovdqa64-1.c: Restrict some
lines to nonpic targets only. Fix up \[^\n^x^y\] to \[^\nxy\]. scan-assembler-times lines to nonpic targets only.
Fix up \[^\n^x^y\] to \[^\nxy\].
2014-12-15 Paolo Carlini <paolo.carlini@oracle.com> 2014-12-15 Paolo Carlini <paolo.carlini@oracle.com>
......
// 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" }
// PR c++/58882
int a[] = { [0.] = 0 }; // { dg-error "integral constant-expression" }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment