[Bug c++/125555] [16/17 Regression] error: mangling of ... conflicts with a previous mangle [import std]

"ppalka at gcc dot gnu.org via Gcc-bugs" <[email protected]>
Newsgroups gmane.comp.gcc.bugs
Message-ID <[email protected]/bugzilla/>
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=125555

--- Comment #8 from Patrick Palka <ppalka at gcc dot gnu.org> ---
Ah but presumably we want to treat instantiations of a non-template friends vs
template friends consistently, which the TI_TEMPLATE (ti) != entry->tmpl check
won't do.  For non-template friend instantiations the check will always be
false, and we'll never record any (full) specializations of non-template
(hidden) friends.

I think this would consistently set is_friend=false on full specializations of
template and non-template friends:

--- a/gcc/cp/module.cc                                                          
+++ b/gcc/cp/module.cc                                                          
@@ -15468,9 +15468,10 @@ depset::hash::add_specializations (bool decl_p)        
                }                                                               
              else if (is_friend)                                               
                {                                                               
-                 if (TI_TEMPLATE (ti) != entry->tmpl                           
-                     || !template_args_equal (TI_ARGS (ti), entry->tmpl))      
+                 if (TREE_CODE (spec) == TEMPLATE_DECL)                        
                    goto template_friend;                                       
+                 else                                                          
+                   is_friend = false;                                          
                }                                                               
            }                                                                   
          else                                                                  

but it regresses a modified a non-template friend version of friend-13.C:

diff --git a/gcc/testsuite/g++.dg/modules/friend-13.C
b/gcc/testsuite/g++.dg/modules/friend-13.C                                      
index 8930eca7ded5..7fe24bafb218 100644                                         
--- a/gcc/testsuite/g++.dg/modules/friend-13.C                                  
+++ b/gcc/testsuite/g++.dg/modules/friend-13.C                                  
@@ -4,7 +4,7 @@                                                                 

 module;                                                                        
 template <typename T> struct tuple {                                           
-  template <typename U> friend void f(tuple, U);                               
+  friend void f(tuple, int) { }                                                
 };                                                                             
 template <typename T> tuple<T> make_unique();                                  
 export module M;                                                               

gcc/testsuite/g++.dg/modules/friend-13.C:10:8: internal compiler error: in
import_entity_index, at cp/module.cc:4337


While perhaps not fully correct/consistent, the TI_TEMPLATE (ti) != entry->tmpl
check seems strictly better than the current buggy code which ignores all
friend specializations, so perhaps we should go with it for now?
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.