mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-03-20 09:20:42 +08:00
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:
parent
d06790a0b2
commit
6bfb1253a4
@ -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
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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>
|
||||
|
||||
|
27
gcc/testsuite/g++.dg/cpp0x/desig1.C
Normal file
27
gcc/testsuite/g++.dg/cpp0x/desig1.C
Normal 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" }
|
3
gcc/testsuite/g++.dg/ext/desig8.C
Normal file
3
gcc/testsuite/g++.dg/ext/desig8.C
Normal file
@ -0,0 +1,3 @@
|
||||
// PR c++/58882
|
||||
|
||||
int a[] = { [0.] = 0 }; // { dg-error "integral constant-expression" }
|
Loading…
x
Reference in New Issue
Block a user