[gcc r14-7262] c++: access of class-scope partial spec

Patrick Palka ppalka@gcc.gnu.org
Mon Jan 15 22:01:50 GMT 2024


https://gcc.gnu.org/g:f40076fa8291600c63d76f528cef0ce4c1f81f6e

commit r14-7262-gf40076fa8291600c63d76f528cef0ce4c1f81f6e
Author: Patrick Palka <ppalka@redhat.com>
Date:   Mon Jan 15 17:01:33 2024 -0500

    c++: access of class-scope partial spec
    
    Since partial specializations can't be named directly, their access
    when declared at class scope is irrelevant, so we shouldn't have to set
    their TREE_PRIVATE / TREE_PROTECTED in maybe_new_partial_specialization
    (which is used only for constrained partial specializations anyway).
    
    This code was added by r10-4833-gcce3c9db9e6ffa for PR92078, but it
    seems better to just disable the access consistency check for partial
    specializations, which lets us accept the below testcase.
    
    gcc/cp/ChangeLog:
    
            * parser.cc (cp_parser_check_access_in_redeclaration): Don't
            check access for a partial or explicit 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.
    
    Reviewed-by: Jason Merrill <jason@redhat.com>

Diff:
---
 gcc/cp/parser.cc                                         |  3 ++-
 gcc/cp/pt.cc                                             |  2 --
 gcc/testsuite/g++.dg/template/partial-specialization14.C | 15 +++++++++++++++
 3 files changed, 17 insertions(+), 3 deletions(-)

diff --git a/gcc/cp/parser.cc b/gcc/cp/parser.cc
index 8ab98cc0c23..fd614ba3f31 100644
--- a/gcc/cp/parser.cc
+++ b/gcc/cp/parser.cc
@@ -35306,7 +35306,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 8d050e81348..b6117231de1 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..37805748959
--- /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 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" }
+};


More information about the Gcc-cvs mailing list