Commit 4699e99a by Paolo Carlini Committed by Paolo Carlini

re PR c++/57887 (nested non-type template parameters not declared in this scope)

/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.

From-SVN: r204818
parent 03a231f7
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> 2013-11-14 Andrew MacLeod <amacleod@redhat.com>
* class.c: Include only gimplify.h and gimple.h as needed. * class.c: Include only gimplify.h and gimple.h as needed.
......
...@@ -23378,12 +23378,16 @@ cp_parser_late_parsing_nsdmi (cp_parser *parser, tree field) ...@@ -23378,12 +23378,16 @@ cp_parser_late_parsing_nsdmi (cp_parser *parser, tree field)
{ {
tree def; tree def;
maybe_begin_member_template_processing (field);
push_unparsed_function_queues (parser); push_unparsed_function_queues (parser);
def = cp_parser_late_parse_one_default_arg (parser, field, def = cp_parser_late_parse_one_default_arg (parser, field,
DECL_INITIAL (field), DECL_INITIAL (field),
NULL_TREE); NULL_TREE);
pop_unparsed_function_queues (parser); pop_unparsed_function_queues (parser);
maybe_end_member_template_processing ();
DECL_INITIAL (field) = def; DECL_INITIAL (field) = def;
} }
......
...@@ -152,7 +152,7 @@ static int for_each_template_parm (tree, tree_fn_t, void*, ...@@ -152,7 +152,7 @@ static int for_each_template_parm (tree, tree_fn_t, void*,
struct pointer_set_t*, bool); struct pointer_set_t*, bool);
static tree expand_template_argument_pack (tree); static tree expand_template_argument_pack (tree);
static tree build_template_parm_index (int, int, int, tree, 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 void push_inline_template_parms_recursive (tree, int);
static tree retrieve_local_specialization (tree); static tree retrieve_local_specialization (tree);
static void register_local_specialization (tree, tree); static void register_local_specialization (tree, tree);
...@@ -378,9 +378,9 @@ template_class_depth (tree type) ...@@ -378,9 +378,9 @@ template_class_depth (tree type)
Returns true if processing DECL needs us to push template parms. */ Returns true if processing DECL needs us to push template parms. */
static bool 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 false;
return (TMPL_PARMS_DEPTH (DECL_TEMPLATE_PARMS (most_general_template (decl))) return (TMPL_PARMS_DEPTH (DECL_TEMPLATE_PARMS (most_general_template (decl)))
...@@ -449,16 +449,23 @@ push_inline_template_parms_recursive (tree parmlist, int levels) ...@@ -449,16 +449,23 @@ push_inline_template_parms_recursive (tree parmlist, int levels)
} }
} }
/* Restore the template parameter context for a member template or /* Restore the template parameter context for a member template, a
a friend template defined in a class definition. */ friend template defined in a class definition, or a non-template
member of template class. */
void void
maybe_begin_member_template_processing (tree decl) maybe_begin_member_template_processing (tree decl)
{ {
tree parms; tree parms;
int levels = 0; 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)); parms = DECL_TEMPLATE_PARMS (most_general_template (decl));
levels = TMPL_PARMS_DEPTH (parms) - processing_template_decl; levels = TMPL_PARMS_DEPTH (parms) - processing_template_decl;
......
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.
2013-11-14 Ulrich Weigand <Ulrich.Weigand@de.ibm.com> 2013-11-14 Ulrich Weigand <Ulrich.Weigand@de.ibm.com>
* gcc.target/powerpc/ppc64-abi-1.c (stack_frame_t): Remove * gcc.target/powerpc/ppc64-abi-1.c (stack_frame_t): Remove
......
// PR c++/58760
// { dg-do compile { target c++11 } }
enum en
{
a,b,c
};
struct B
{
template<en N>
struct A
{
const int X = N;
};
};
// PR c++/57887
// { dg-do compile { target c++11 } }
struct B
{
template<int N>
struct A
{
int X = N;
};
};
template<int M>
struct C
{
int Y = M;
template<int N>
struct A
{
int X = N;
int Y = M;
};
};
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment