From: Jason Merrill Date: Mon, 9 Nov 2009 22:01:09 +0000 (-0500) Subject: re PR c++/41972 (nondependent static member function as a reference template paramete... X-Git-Tag: releases/gcc-4.3.5~304 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=88fa5ab7c5d0da1f3a1b7610d94b757108952e77;p=thirdparty%2Fgcc.git re PR c++/41972 (nondependent static member function as a reference template parameter fails) PR c++/41972 * parser.c (cp_parser_template_argument): Accept SCOPE_REF around VAR_DECL. From-SVN: r154053 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 7477e82161d0..283b2399ad79 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2009-11-09 Jason Merrill + + PR c++/41972 + * parser.c (cp_parser_template_argument): Accept SCOPE_REF around + VAR_DECL. + 2009-11-04 Jason Merrill PR c++/35067 diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 4c4ba9c2d1de..d13cf379a558 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -10296,18 +10296,26 @@ cp_parser_template_argument (cp_parser* parser) cp_parser_abort_tentative_parse (parser); else { + tree probe; + if (TREE_CODE (argument) == INDIRECT_REF) { gcc_assert (REFERENCE_REF_P (argument)); argument = TREE_OPERAND (argument, 0); } - if (TREE_CODE (argument) == VAR_DECL) + /* If we're in a template, we represent a qualified-id referring + to a static data member as a SCOPE_REF even if the scope isn't + dependent so that we can check access control later. */ + probe = argument; + if (TREE_CODE (probe) == SCOPE_REF) + probe = TREE_OPERAND (probe, 1); + if (TREE_CODE (probe) == VAR_DECL) { /* A variable without external linkage might still be a valid constant-expression, so no error is issued here if the external-linkage check fails. */ - if (!address_p && !DECL_EXTERNAL_LINKAGE_P (argument)) + if (!address_p && !DECL_EXTERNAL_LINKAGE_P (probe)) cp_parser_simulate_error (parser); } else if (is_overloaded_fn (argument)) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index cd44c06eeaf8..cf487e7f93f8 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2009-11-09 Jason Merrill + + PR c++/41972 + * g++.dg/template/ref4.C: New. + 2009-11-04 Jason Merrill PR c++/36912 diff --git a/gcc/testsuite/g++.dg/template/ref4.C b/gcc/testsuite/g++.dg/template/ref4.C new file mode 100644 index 000000000000..6d89fa80a841 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/ref4.C @@ -0,0 +1,12 @@ +// PR c++/41972 + +struct X { + static const double x; +}; +template + class Foo { }; +template +struct Y { + typedef Foo type; +}; +