[PATCH] D22311: [Sema] Improve template argument deduction diagnostic for ambiguous base classes

Richard Smith via cfe-commits cfe-commits at lists.llvm.org
Wed Jul 13 12:49:45 PDT 2016


rsmith added inline comments.

================
Comment at: include/clang/Basic/DiagnosticSemaKinds.td:3227
@@ -3226,1 +3226,3 @@
+def note_ovl_candidate_ambiguous_base_classes : Note<
+    "candidate template ignored: ambiguous base classes of %0 match %1">;
 
----------------
ambiguous -> multiple, perhaps? (An "ambiguous base class" is something else.)


However, even that's not quite right. The rule is (from [temp.deduct.call]/5):

  "If <deducing against all base classes> yields more than one possible deduced A, type deduction fails"

... so deduction failure only happens if the base classes deduce different template arguments, not just if multiple deductions succeed. In particular, if you multiply-inherit from the same base class, then deduction can succeed (even though the subsequent initialization of the parameter will fail due to ambiguity):

  template<int> struct A {};
  struct B : A<0> {};
  struct C : A<1> {};
  struct D : B, C {};
  template<int N> void f(A<N>);
  void f(...);
  void g(D d) { f(d); }  // deduction should succeed, should choose f<0>, result is hard error due to ambiguity

So maybe we should word this more like the `note_ovl_candidate_deduced_mismatch` case, since the problem really is that we deduced two different values for the same template parameter.

================
Comment at: include/clang/Sema/Sema.h:6450
@@ -6449,1 +6449,3 @@
+    /// \brief Multiple base classes could have been successfully deduced.
+    TDK_AmbiguousBaseClasses,
     /// \brief Deduction failed; that's all we know.
----------------
`TDK_InconsistentBaseClassDeduction` maybe?

================
Comment at: lib/Sema/SemaOverload.cpp:599-603
@@ -597,7 +598,7 @@
   case Sema::TDK_NonDeducedMismatch: {
     // FIXME: Should allocate from normal heap so that we can free this later.
     DFIArguments *Saved = new (Context) DFIArguments;
     Saved->FirstArg = Info.FirstArg;
     Saved->SecondArg = Info.SecondArg;
     Result.Data = Saved;
     break;
----------------
Please update the comments in include/clang/Sema/TemplateDeduction.h to say what `Info.FirstArg` and `Info.SecondArg` mean for `TDK_AmbiguousBaseClasses`.


http://reviews.llvm.org/D22311





More information about the cfe-commits mailing list