mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-03-26 09:50:40 +08:00
re PR c++/68585 (c++14 code accepted by 4.9 not accepted by 5 and 6)
PR c++/68585 * constexpr.c (cxx_eval_bare_aggregate): Fix 'changed' detection. From-SVN: r233513
This commit is contained in:
parent
50ccdf5bc2
commit
bcb5f3c9f5
@ -1,5 +1,8 @@
|
||||
2016-02-17 Jason Merrill <jason@redhat.com>
|
||||
|
||||
PR c++/68585
|
||||
* constexpr.c (cxx_eval_bare_aggregate): Fix 'changed' detection.
|
||||
|
||||
PR c++/68679
|
||||
* decl2.c (reset_type_linkage_2): Look through member templates.
|
||||
|
||||
|
@ -2234,6 +2234,7 @@ cxx_eval_bare_aggregate (const constexpr_ctx *ctx, tree t,
|
||||
bool side_effects_p = false;
|
||||
FOR_EACH_CONSTRUCTOR_ELT (v, i, index, value)
|
||||
{
|
||||
tree orig_value = value;
|
||||
constexpr_ctx new_ctx;
|
||||
init_subob_ctx (ctx, new_ctx, index, value);
|
||||
if (new_ctx.ctor != ctx->ctor)
|
||||
@ -2246,7 +2247,7 @@ cxx_eval_bare_aggregate (const constexpr_ctx *ctx, tree t,
|
||||
/* Don't VERIFY_CONSTANT here. */
|
||||
if (ctx->quiet && *non_constant_p)
|
||||
break;
|
||||
if (elt != value)
|
||||
if (elt != orig_value)
|
||||
changed = true;
|
||||
|
||||
if (!TREE_CONSTANT (elt))
|
||||
|
41
gcc/testsuite/g++.dg/cpp0x/constexpr-initlist9.C
Normal file
41
gcc/testsuite/g++.dg/cpp0x/constexpr-initlist9.C
Normal file
@ -0,0 +1,41 @@
|
||||
// PR c++/68585
|
||||
// { dg-do compile { target c++11 } }
|
||||
|
||||
template<typename T, unsigned N>
|
||||
struct array
|
||||
{
|
||||
T _M_data[N];
|
||||
};
|
||||
|
||||
template<typename _Tp, _Tp... _Idx>
|
||||
struct integer_sequence
|
||||
{
|
||||
};
|
||||
|
||||
struct Pos
|
||||
{
|
||||
unsigned l;
|
||||
};
|
||||
|
||||
template<class T, T... Ints>
|
||||
constexpr array<Pos, sizeof...(Ints)> make_grid_position(integer_sequence<T, Ints...>)
|
||||
{
|
||||
return {{ Pos{Ints}... }};
|
||||
}
|
||||
|
||||
constexpr array<Pos, 1> make_grid_positions()
|
||||
{
|
||||
return make_grid_position(integer_sequence<unsigned, 0>{});
|
||||
}
|
||||
|
||||
template<class T>
|
||||
void generate_sudoku(T)
|
||||
{
|
||||
constexpr auto positions = make_grid_positions(); // fail
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
constexpr auto positions = make_grid_positions(); // ok
|
||||
generate_sudoku(1);
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user