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:
parent
eb02633818
commit
6fd4488141
@ -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.
|
||||
|
@ -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. */
|
||||
|
13
gcc/cp/pt.c
13
gcc/cp/pt.c
@ -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;
|
||||
|
@ -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.
|
||||
|
||||
|
19
gcc/testsuite/g++.dg/cpp0x/nsdmi-defer3.C
Normal file
19
gcc/testsuite/g++.dg/cpp0x/nsdmi-defer3.C
Normal 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()};
|
Loading…
Reference in New Issue
Block a user