Implement N3653 (Member initializers and aggregates) and fix references to 'this...
authorJason Merrill <jason@redhat.com>
Mon, 27 Oct 2014 17:42:12 +0000 (13:42 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Mon, 27 Oct 2014 17:42:12 +0000 (13:42 -0400)
commit3e605b20a0c804d57d4be0f4f2bbab8b4e42fce6
treeac2bca0b20f76ea658c7bbcb7dda73ababce83b9
parentddc8de034a1f79861fed57b231813a5c5c48a130
Implement N3653 (Member initializers and aggregates) and fix references to 'this' in constexpr constructors.

Implement N3653 (Member initializers and aggregates) and fix
references to 'this' in constexpr constructors.
* class.c (check_field_decls): In C++14 an NSDMI does not make the
class non-aggregate.
* constexpr.c (struct constexpr_ctx): New.
(cxx_bind_parameters_in_call): Handle 'this'.
(cxx_eval_call_expression): Create new constexpr_ctx.
(cxx_eval_component_reference): Check CONSTRUCTOR_NO_IMPLICIT_ZERO.
(initialized_type, init_subob_ctx, verify_ctor_sanity): New.
(cxx_eval_bare_aggregate): Use them.  Build CONSTRUCTOR early.
(cxx_eval_vec_init_1): Likewise.
(cxx_eval_constant_expression) [PARM_DECL]: Allow 'this'.
[TARGET_EXPR]: Build new constexpr_ctx.
[PLACEHOLDER_EXPR]: New.
(cxx_eval_outermost_constant_expr): Build new constexpr_ctx.  Add
object parameter.
(is_sub_constant_expr): Build new constexpr_ctx.
(potential_constant_expression_1): Handle PLACEHOLDER_EXPR.
Allow 'this'.
* cp-gimplify.c (cp_gimplify_init_expr): Call replace_placeholders.
* cp-tree.h (CONSTRUCTOR_NO_IMPLICIT_ZERO): New.
* error.c (dump_expr): Handle PLACEHOLDER_EXPR.
* init.c (get_nsdmi): Generate PLACEHOLDER_EXPR.
* tree.c (lvalue_kind): Handle PLACEHOLDER_EXPR.
(build_ctor_subob_ref, replace_placeholders): New.
* typeck2.c (store_init_value): Use replace_placeholders.
(process_init_constructor_record): Make zero-init before NSDMI
explicit.

From-SVN: r216750
16 files changed:
gcc/cp/ChangeLog
gcc/cp/class.c
gcc/cp/constexpr.c
gcc/cp/cp-gimplify.c
gcc/cp/cp-tree.h
gcc/cp/error.c
gcc/cp/init.c
gcc/cp/tree.c
gcc/cp/typeck2.c
gcc/testsuite/g++.dg/cpp0x/constexpr-48089.C
gcc/testsuite/g++.dg/cpp0x/constexpr-ctor14.C [new file with mode: 0644]
gcc/testsuite/g++.dg/cpp0x/constexpr-ctor14a.C [new file with mode: 0644]
gcc/testsuite/g++.dg/cpp0x/nsdmi7.C
gcc/testsuite/g++.dg/cpp1y/nsdmi-aggr1.C [new file with mode: 0644]
gcc/testsuite/g++.dg/cpp1y/nsdmi-aggr2.C [new file with mode: 0644]
gcc/testsuite/lib/prune.exp