diff options
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 3 | ||||
-rw-r--r-- | gcc/cp/init.c | 12 | ||||
-rw-r--r-- | gcc/cp/pt.c | 13 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 2 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/nsdmi-defer3.C | 19 |
5 files changed, 43 insertions, 6 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index f1496b6..fc5436a 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -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. diff --git a/gcc/cp/init.c b/gcc/cp/init.c index f5904d5..f246286 100644 --- a/gcc/cp/init.c +++ b/gcc/cp/init.c @@ -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. */ diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index af5ca5c..ebadebf 100644 --- a/gcc/cp/pt.c +++ b/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; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 1e51669..a8b10cd 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -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. diff --git a/gcc/testsuite/g++.dg/cpp0x/nsdmi-defer3.C b/gcc/testsuite/g++.dg/cpp0x/nsdmi-defer3.C new file mode 100644 index 0000000..2777fb5 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/nsdmi-defer3.C @@ -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()}; |