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
This commit is contained in:
Paolo Carlini 2014-12-15 16:16:29 +00:00
parent d06790a0b2
commit 6bfb1253a4
5 changed files with 55 additions and 7 deletions

View File

@ -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

View File

@ -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;
}

View File

@ -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>

View File

@ -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" }

View File

@ -0,0 +1,3 @@
// PR c++/58882
int a[] = { [0.] = 0 }; // { dg-error "integral constant-expression" }