From: Paolo Carlini Date: Thu, 14 Nov 2013 20:16:51 +0000 (+0000) Subject: re PR c++/57887 (nested non-type template parameters not declared in this scope) X-Git-Tag: releases/gcc-4.9.0~2782 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=4699e99ae8aae2dcb12b84d7d9516a08f5c8dc8a;p=thirdparty%2Fgcc.git re PR c++/57887 (nested non-type template parameters not declared in this scope) /cp 2013-11-14 Paolo Carlini 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 PR c++/57887 * g++.dg/cpp0x/nsdmi-template3.C: New. * g++.dg/cpp0x/nsdmi-template4.C: Likewise. From-SVN: r204818 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 54e424f1678a..b252637421f7 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,11 @@ +2013-11-14 Paolo Carlini + + 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 * class.c: Include only gimplify.h and gimple.h as needed. diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index eaad8e44aa79..ab3325794d1b 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 b80591d47361..e714e790eadf 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; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index dd787dda5592..2077304a55c9 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2013-11-14 Paolo Carlini + + PR c++/57887 + * g++.dg/cpp0x/nsdmi-template3.C: New. + * g++.dg/cpp0x/nsdmi-template4.C: Likewise. + 2013-11-14 Ulrich Weigand * gcc.target/powerpc/ppc64-abi-1.c (stack_frame_t): Remove diff --git a/gcc/testsuite/g++.dg/cpp0x/nsdmi-template3.C b/gcc/testsuite/g++.dg/cpp0x/nsdmi-template3.C new file mode 100644 index 000000000000..8a6f913d215b --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/nsdmi-template3.C @@ -0,0 +1,16 @@ +// PR c++/58760 +// { dg-do compile { target c++11 } } + +enum en +{ + a,b,c +}; + +struct B +{ + template + struct A + { + const int X = N; + }; +}; diff --git a/gcc/testsuite/g++.dg/cpp0x/nsdmi-template4.C b/gcc/testsuite/g++.dg/cpp0x/nsdmi-template4.C new file mode 100644 index 000000000000..ff8dc7e932bc --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/nsdmi-template4.C @@ -0,0 +1,24 @@ +// PR c++/57887 +// { dg-do compile { target c++11 } } + +struct B +{ + template + struct A + { + int X = N; + }; +}; + +template +struct C +{ + int Y = M; + + template + struct A + { + int X = N; + int Y = M; + }; +};