On 11/2/20 10:10 AM, kamlesh kumar wrote:
addressed jason comments.
no regression due to this, tested on x86_64 linux.

On Tue, Oct 27, 2020 at 11:09 PM Jason Merrill <ja...@redhat.com> wrote:

On 10/22/20 1:31 PM, kamlesh kumar wrote:
Attaching the patch file.

  >>Instead of building a hash table, would it work to handle ambiguity by
  >>checking whether one of the classes is a base of the other?

Fixing for cases like: struct B: A<int>,A<int,int> may not be cleaner
this way.

Why not?  Your patch does extra work even when there's no ambiguity.

On Thu, Oct 22, 2020 at 3:23 AM Jason Merrill <ja...@redhat.com
<mailto:ja...@redhat.com>> wrote:
  >
  > On 10/21/20 6:32 AM, kamlesh kumar wrote:
  > > gcc/cp/ChangeLog
  > > -----------------------------------
  > >
  > > 2020-10-21  Kamlesh Kumar  <kamleshbha...@gmail.com
<mailto:kamleshbha...@gmail.com>>
  > >
  > > PR c++/97453
  > > * pt.c (get_template_base): Implement DR2303,
  > > Consider closest base while template
  > > deduction when base of base also matches.
  > >
  > > gcc/testsuite/ChangeLog
  > > ------------------------------------------
  > >
  > > 2020-10-21  Kamlesh Kumar  <kamleshbha...@gmail.com
<mailto:kamleshbha...@gmail.com>>
  > >
  > > * g++.dg/Drs/dr2303.C: New Test
  > >
  > > --------------------------------------------------
  > >
  > > As part of this patch I Implemented fix for below defect report in cwg
  > > https://wg21.cmeerw.net/cwg/issue2303 .
  >
  > Thanks!
  >
  > Please see https://gcc.gnu.org/contribute.html for guidance on email
  > subject lines; for this patch I'd think something like
  >
  > [PATCH] c++: Implement DR2303 [PR97453]
  >
  > Also, your patch was corrupted by word wrap; the easiest way to avoid
  > that is probably to attach the file rather than copy it into the message.
  >
  > > Reg tested on x86_64 and did not found any failure.
  > > Patch summary: Remove base of base from list of bases
  > >
  > > created a hash_set from list of bases and then iterate over each
  > > element of hash_set and find its  list of bases and remove this from
  > > hash_set if present.
  > > and finally, deduction succeeds if in hash_set remains only single
  > > element or it's empty.
  > > otherwise deduction is ambiguous.
  >
  > Instead of building a hash table, would it work to handle ambiguity by
  > checking whether one of the classes is a base of the other?

This is what I had in mind; it seems clearer to me. Do you see a reason this wouldn't work?

Also, I notice that you still don't seem to have a copyright assignment on file with the FSF. I and Jonathan Wakely both asked about it last year; has there been any progress on that? Your patch is too large to go in without a copyright assignment, so it's probably simplest to go ahead with mine.

Thanks,
Jason
commit 6b0fc692d57f38ec69ea739117ac3d4552cd0d23
Author: kamlesh kumar <kamleshbha...@gmail.com>
Date:   Mon Nov 2 20:40:21 2020 +0530

    c++: Implement DR2303 [PR97453]
    
    gcc/cp/ChangeLog
    
    2020-10-21  Kamlesh Kumar  <kamleshbha...@gmail.com>
                Jason Merrill  <ja...@redhat.com>
    
            PR c++/97453
            DR2303
            * pt.c (get_template_base): Implement DR2303,
            Consider closest base while template
            deduction when base of base also matches.
    
    gcc/testsuite/ChangeLog
    
    2020-10-21  Kamlesh Kumar  <kamleshbha...@gmail.com>
    
            g++.dg/DRs/dr2303.C: New test.

diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index f31a1a70473..245b7a83a92 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -22693,8 +22693,20 @@ get_template_base (tree tparms, tree targs, tree parm, tree arg,
 	     applies.  */
 	  if (rval && !same_type_p (r, rval))
 	    {
-	      *result = NULL_TREE;
-	      return tbr_ambiguous_baseclass;
+	      /* [temp.deduct.call]/4.3: If there is a class C that is a
+		 (direct or indirect) base class of D and derived (directly or
+		 indirectly) from a class B and that would be a valid deduced
+		 A, the deduced A cannot be B or pointer to B, respectively. */
+	      if (DERIVED_FROM_P (r, rval))
+		/* Ignore r.  */
+		continue;
+	      else if (DERIVED_FROM_P (rval, r))
+		/* Discard rval.  */;
+	      else
+		{
+		  *result = NULL_TREE;
+		  return tbr_ambiguous_baseclass;
+		}
 	    }
 
 	  rval = r;
diff --git a/gcc/testsuite/g++.dg/DRs/dr2303.C b/gcc/testsuite/g++.dg/DRs/dr2303.C
new file mode 100644
index 00000000000..b6acb6e2197
--- /dev/null
+++ b/gcc/testsuite/g++.dg/DRs/dr2303.C
@@ -0,0 +1,37 @@
+// DR 2303
+// PR c++/97453
+// { dg-do compile { target c++11 } }
+
+template <typename... T> struct A;
+template <> struct A<>
+{
+};
+template <typename T, typename... Ts> struct A<T, Ts...> : A<Ts...>
+{
+};
+struct B : A<int, int>
+{
+};
+
+struct C : A<int, int>, A<int> //  { dg-warning "direct base .A<int>. inaccessible in .C. due to ambiguity" }
+{
+};
+
+struct D : A<int>, A<int, int> //  { dg-warning "direct base .A<int>. inaccessible in .D. due to ambiguity" }
+{
+};
+template <typename... T>
+void
+f (const A<T...> &)
+{
+  static_assert (sizeof...(T) == 2, "it should duduce to A<int,int>");
+}
+
+
+void
+g ()
+{
+  f (B{});
+  f (C{});
+  f (D{});
+}

Reply via email to