diff options
author | paolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4> | 2013-11-14 20:16:51 +0000 |
---|---|---|
committer | paolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4> | 2013-11-14 20:16:51 +0000 |
commit | b5d5fce5a0f00df90dff22a545cf05089e481c65 (patch) | |
tree | 6d59cdf20f8923f0d77ccbba3fdef079f1e2533b /gcc/cp | |
parent | 95b149fd51f86b35f7a6e82d28602a479319943e (diff) | |
download | gcc-b5d5fce5a0f00df90dff22a545cf05089e481c65.tar.gz |
/cp
2013-11-14 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/57887
* parser.c (cp_parser_late_parsing_nsdmi): Call
maybe_begin_member_template_processing.
* pt.c (maybe_begin_member_template_processing): Handle NSDMIs.
(inline_needs_template_parms): Adjust.
/testsuite
2013-11-14 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/57887
* g++.dg/cpp0x/nsdmi-template3.C: New.
* g++.dg/cpp0x/nsdmi-template4.C: Likewise.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@204818 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/cp')
-rw-r--r-- | gcc/cp/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/cp/parser.c | 4 | ||||
-rw-r--r-- | gcc/cp/pt.c | 19 |
3 files changed, 25 insertions, 6 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 54e424f1678..b252637421f 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,11 @@ +2013-11-14 Paolo Carlini <paolo.carlini@oracle.com> + + PR c++/57887 + * parser.c (cp_parser_late_parsing_nsdmi): Call + maybe_begin_member_template_processing. + * pt.c (maybe_begin_member_template_processing): Handle NSDMIs. + (inline_needs_template_parms): Adjust. + 2013-11-14 Andrew MacLeod <amacleod@redhat.com> * class.c: Include only gimplify.h and gimple.h as needed. diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index eaad8e44aa7..ab3325794d1 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -23378,12 +23378,16 @@ cp_parser_late_parsing_nsdmi (cp_parser *parser, tree field) { tree def; + maybe_begin_member_template_processing (field); + push_unparsed_function_queues (parser); def = cp_parser_late_parse_one_default_arg (parser, field, DECL_INITIAL (field), NULL_TREE); pop_unparsed_function_queues (parser); + maybe_end_member_template_processing (); + DECL_INITIAL (field) = def; } diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index b80591d4736..e714e790ead 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -152,7 +152,7 @@ static int for_each_template_parm (tree, tree_fn_t, void*, struct pointer_set_t*, bool); static tree expand_template_argument_pack (tree); static tree build_template_parm_index (int, int, int, tree, tree); -static bool inline_needs_template_parms (tree); +static bool inline_needs_template_parms (tree, bool); static void push_inline_template_parms_recursive (tree, int); static tree retrieve_local_specialization (tree); static void register_local_specialization (tree, tree); @@ -378,9 +378,9 @@ template_class_depth (tree type) Returns true if processing DECL needs us to push template parms. */ static bool -inline_needs_template_parms (tree decl) +inline_needs_template_parms (tree decl, bool nsdmi) { - if (! DECL_TEMPLATE_INFO (decl)) + if (!decl || (!nsdmi && ! DECL_TEMPLATE_INFO (decl))) return false; return (TMPL_PARMS_DEPTH (DECL_TEMPLATE_PARMS (most_general_template (decl))) @@ -449,16 +449,23 @@ push_inline_template_parms_recursive (tree parmlist, int levels) } } -/* Restore the template parameter context for a member template or - a friend template defined in a class definition. */ +/* Restore the template parameter context for a member template, a + friend template defined in a class definition, or a non-template + member of template class. */ void maybe_begin_member_template_processing (tree decl) { tree parms; int levels = 0; + bool nsdmi = TREE_CODE (decl) == FIELD_DECL; - if (inline_needs_template_parms (decl)) + if (nsdmi) + decl = (CLASSTYPE_TEMPLATE_INFO (DECL_CONTEXT (decl)) + ? CLASSTYPE_TI_TEMPLATE (DECL_CONTEXT (decl)) + : NULL_TREE); + + if (inline_needs_template_parms (decl, nsdmi)) { parms = DECL_TEMPLATE_PARMS (most_general_template (decl)); levels = TMPL_PARMS_DEPTH (parms) - processing_template_decl; |