summaryrefslogtreecommitdiff
path: root/gcc/cp
diff options
context:
space:
mode:
authorpaolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4>2013-11-14 20:16:51 +0000
committerpaolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4>2013-11-14 20:16:51 +0000
commitb5d5fce5a0f00df90dff22a545cf05089e481c65 (patch)
tree6d59cdf20f8923f0d77ccbba3fdef079f1e2533b /gcc/cp
parent95b149fd51f86b35f7a6e82d28602a479319943e (diff)
downloadgcc-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/ChangeLog8
-rw-r--r--gcc/cp/parser.c4
-rw-r--r--gcc/cp/pt.c19
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;