On 1/3/24 15:06, Patrick Palka wrote:
Bootstrapped and regtested on x86_64-pc-linux-gnu, does this look
OK for trunk?
OK.
-- >8 --
Since partial template specializations can't be named directly, access
control (when declared at class scope) doesn't apply to them, so we
shouldn't have to set their TREE_PRIVATE / TREE_PROTECTED. This code was
added by r10-4833-gcce3c9db9e6ffa for PR92078, but it seems better to
just disable the relevant access consistency check for partial template
specializations so that we also accept the below testcase.
gcc/cp/ChangeLog:
* parser.cc (cp_parser_check_access_in_redeclaration): Don't
check access for a partial specialization.
* pt.cc (maybe_new_partial_specialization): Don't set TREE_PRIVATE
or TREE_PROTECTED on the newly created partial specialization.
gcc/testsuite/ChangeLog:
* g++.dg/template/partial-specialization14.C: New test.
---
gcc/cp/parser.cc | 3 ++-
gcc/cp/pt.cc | 2 --
.../g++.dg/template/partial-specialization14.C | 15 +++++++++++++++
3 files changed, 17 insertions(+), 3 deletions(-)
create mode 100644 gcc/testsuite/g++.dg/template/partial-specialization14.C
diff --git a/gcc/cp/parser.cc b/gcc/cp/parser.cc
index 37536faf2cf..85da15651b2 100644
--- a/gcc/cp/parser.cc
+++ b/gcc/cp/parser.cc
@@ -35062,7 +35062,8 @@ static void
cp_parser_check_access_in_redeclaration (tree decl, location_t location)
{
if (!decl
- || (!CLASS_TYPE_P (TREE_TYPE (decl))
+ || (!(CLASS_TYPE_P (TREE_TYPE (decl))
+ && !CLASSTYPE_TEMPLATE_SPECIALIZATION (TREE_TYPE (decl)))
&& TREE_CODE (TREE_TYPE (decl)) != ENUMERAL_TYPE))
return;
diff --git a/gcc/cp/pt.cc b/gcc/cp/pt.cc
index 154ac76cb65..afd1df4f3d7 100644
--- a/gcc/cp/pt.cc
+++ b/gcc/cp/pt.cc
@@ -978,8 +978,6 @@ maybe_new_partial_specialization (tree& type)
tree d = create_implicit_typedef (DECL_NAME (tmpl), t);
DECL_CONTEXT (d) = TYPE_CONTEXT (t);
DECL_SOURCE_LOCATION (d) = input_location;
- TREE_PRIVATE (d) = (current_access_specifier == access_private_node);
- TREE_PROTECTED (d) = (current_access_specifier == access_protected_node);
TREE_PUBLIC (d) = TREE_PUBLIC (DECL_TEMPLATE_RESULT (tmpl));
set_instantiating_module (d);
diff --git a/gcc/testsuite/g++.dg/template/partial-specialization14.C
b/gcc/testsuite/g++.dg/template/partial-specialization14.C
new file mode 100644
index 00000000000..ac7bc9ed7f1
--- /dev/null
+++ b/gcc/testsuite/g++.dg/template/partial-specialization14.C
@@ -0,0 +1,15 @@
+// Verify we don't care about the access specifier when declaring
+// a partial template specialization of a member class template.
+
+struct A1 {
+ template<class T> struct B { };
+private:
+ template<class T> struct B<T*> { }; // { dg-bogus "different access" }
+};
+
+struct A2 {
+ template<class T> struct B { };
+ template<class T> struct B<T*>;
+private:
+ template<class T> struct B<T*> { }; // { dg-bogus "different access" }
+};