From 0de2d392b0e7e5a9e44113ecf7f1a2e5c300333b Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Mon, 9 Nov 2009 13:32:53 -0500 Subject: [PATCH] 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: r154042 --- gcc/cp/ChangeLog | 4 ++++ gcc/cp/parser.c | 12 ++++++++++-- gcc/testsuite/ChangeLog | 3 +++ gcc/testsuite/g++.dg/template/ref4.C | 12 ++++++++++++ 4 files changed, 29 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/g++.dg/template/ref4.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index f126a104d58..24da7cf5f3c 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,9 @@ 2009-11-09 Jason Merrill + PR c++/41972 + * parser.c (cp_parser_template_argument): Accept SCOPE_REF around + VAR_DECL. + PR c++/41994 * pt.c (tsubst_baselink): tsubst the name. diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 7bafb67bc1c..3475723f0be 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -11368,18 +11368,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 a470e60eb28..9192268071c 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,8 @@ 2009-11-09 Jason Merrill + PR c++/41972 + * g++.dg/template/ref4.C: New. + PR c++/41994 * g++.dg/template/conv10.C: New. diff --git a/gcc/testsuite/g++.dg/template/ref4.C b/gcc/testsuite/g++.dg/template/ref4.C new file mode 100644 index 00000000000..6d89fa80a84 --- /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; +}; +