init.c (perform_member_init): Instantiate NSDMI here.

* init.c (perform_member_init): Instantiate NSDMI here.
	* pt.c (tsubst_decl) [FIELD_DECL]: Not here.

From-SVN: r179157
This commit is contained in:
Jason Merrill 2011-09-24 22:26:08 -04:00 committed by Jason Merrill
parent eb02633818
commit 6fd4488141
5 changed files with 43 additions and 6 deletions

View File

@ -1,5 +1,8 @@
2011-09-24 Jason Merrill <jason@redhat.com>
* init.c (perform_member_init): Instantiate NSDMI here.
* pt.c (tsubst_decl) [FIELD_DECL]: Not here.
Handle deferred parsing of NSDMIs.
* parser.h (cp_unparsed_functions_entry): Add nsdmis field.
* parser.c (unparsed_nsdmis, cp_parser_save_nsdmi): New.

View File

@ -496,7 +496,17 @@ perform_member_init (tree member, tree init)
/* Use the non-static data member initializer if there was no
mem-initializer for this field. */
if (init == NULL_TREE)
init = break_out_target_exprs (DECL_INITIAL (member));
{
if (CLASSTYPE_TEMPLATE_INSTANTIATION (DECL_CONTEXT (member)))
/* Do deferred instantiation of the NSDMI. */
init = (tsubst_copy_and_build
(DECL_INITIAL (member),
CLASSTYPE_TI_ARGS (DECL_CONTEXT (member)),
tf_warning_or_error, member, /*function_p=*/false,
/*integral_constant_expression_p=*/false));
else
init = break_out_target_exprs (DECL_INITIAL (member));
}
/* Effective C++ rule 12 requires that all data members be
initialized. */

View File

@ -10264,11 +10264,14 @@ tsubst_decl (tree t, tree args, tsubst_flags_t complain)
TREE_TYPE (r) = type;
cp_apply_type_quals_to_decl (cp_type_quals (type), r);
/* DECL_INITIAL gives the number of bits in a bit-field. */
DECL_INITIAL (r)
= tsubst_expr (DECL_INITIAL (t), args,
complain, in_decl,
/*integral_constant_expression_p=*/true);
if (DECL_C_BIT_FIELD (r))
/* For bit-fields, DECL_INITIAL gives the number of bits. For
non-bit-fields DECL_INITIAL is a non-static data member
initializer, which gets deferred instantiation. */
DECL_INITIAL (r)
= tsubst_expr (DECL_INITIAL (t), args,
complain, in_decl,
/*integral_constant_expression_p=*/true);
/* We don't have to set DECL_CONTEXT here; it is set by
finish_member_declaration. */
DECL_CHAIN (r) = NULL_TREE;

View File

@ -1,5 +1,7 @@
2011-09-24 Jason Merrill <jason@redhat.com>
* g++.dg/cpp0x/nsdmi-defer3.C: New.
* g++.dg/cpp0x/nsdmi-defer1.C: New.
* g++.dg/cpp0x/nsdmi-defer2.C: New.

View File

@ -0,0 +1,19 @@
// Do NSDMI get deferred instantiation?
// { dg-options -std=c++0x }
template <class T>
struct A
{
T t = T(42);
constexpr A() { }
A(T t): t(t) { }
};
struct B { };
#define SA(X) static_assert(X,#X)
constexpr A<int> a1;
SA(a1.t == 42);
A<B> a2 {B()};