[gcc/devel/autopar_devel] c++: abbreviated function template friend matching [PR96106]

Giuliano Belinassi giulianob@gcc.gnu.org
Sun Aug 23 00:07:07 GMT 2020


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

commit eaaf836cd913ebea8479580cb23b82ae310096ed
Author: Patrick Palka <ppalka@redhat.com>
Date:   Wed Jul 29 22:06:36 2020 -0400

    c++: abbreviated function template friend matching [PR96106]
    
    In the below testcase, duplicate_decls wasn't merging the tsubsted
    friend declaration for 'void add(auto)' with its definition, because
    reduce_template_parm_level (during tsubst_friend_function) lost the
    DECL_VIRTUAL_P flag on the auto's invented template parameter, which
    caused template_heads_equivalent_p to deem the two template heads as not
    equivalent in C++20 mode.
    
    This patch makes reduce_template_parm_level carry over the
    DECL_VIRTUAL_P flag from the original TEMPLATE_PARM_DECL.
    
    gcc/cp/ChangeLog:
    
            PR c++/96106
            * pt.c (reduce_template_parm_level): Propagate DECL_VIRTUAL_P
            from the original TEMPLATE_PARM_DECL to the new lowered one.
    
    gcc/testsuite/ChangeLog:
    
            PR c++/96106
            * g++.dg/concepts/abbrev7.C: New test.

Diff:
---
 gcc/cp/pt.c                             |  1 +
 gcc/testsuite/g++.dg/concepts/abbrev7.C | 14 ++++++++++++++
 2 files changed, 15 insertions(+)

diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index 9b4e6ce7d89..15be7b6d972 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -4453,6 +4453,7 @@ reduce_template_parm_level (tree index, tree type, int levels, tree args,
 			      type);
       TREE_CONSTANT (decl) = TREE_CONSTANT (orig_decl);
       TREE_READONLY (decl) = TREE_READONLY (orig_decl);
+      DECL_VIRTUAL_P (decl) = DECL_VIRTUAL_P (orig_decl);
       DECL_ARTIFICIAL (decl) = 1;
       SET_DECL_TEMPLATE_PARM_P (decl);
 
diff --git a/gcc/testsuite/g++.dg/concepts/abbrev7.C b/gcc/testsuite/g++.dg/concepts/abbrev7.C
new file mode 100644
index 00000000000..443c1b7871b
--- /dev/null
+++ b/gcc/testsuite/g++.dg/concepts/abbrev7.C
@@ -0,0 +1,14 @@
+// PR c++/96106
+// { dg-do compile { target concepts } }
+
+template<typename>
+struct number {
+  friend void add(auto);
+};
+
+void add(auto) { }
+
+void foo() {
+  number<int> n;
+  add(n); // { dg-bogus "ambiguous" }
+}


More information about the Gcc-cvs mailing list