[PATCH] D133683: [c++] implements tentative DR1432 for partial ordering of function template

Yuanfang Chen via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Tue Sep 13 17:27:51 PDT 2022


ychen added a comment.

@mizvekov Thanks for taking a look.



================
Comment at: clang/lib/Sema/SemaTemplateDeduction.cpp:5195-5196
+    for (int i = 0, e = std::min(NumParams1, NumParams2); i < e; ++i) {
+      QualType T1 = FD1->getParamDecl(i)->getType().getDesugaredType(Context);
+      QualType T2 = FD2->getParamDecl(i)->getType().getDesugaredType(Context);
+      auto *TST1 = dyn_cast<TemplateSpecializationType>(T1);
----------------
mizvekov wrote:
> This should work, as all the properties you are testing below are present on the canonical type.
Gotta admit that I was confused by `DesugaredType` and `CanonicalType`.  But since you pointed it out, I could see the differences now. The `CanonicalType` could be sugared, and desugaring is not necessary here. Thanks.


================
Comment at: clang/lib/Sema/SemaTemplateDeduction.cpp:5455-5456
     if (!ClangABICompat15) {
-      // Consider this a fix for CWG1432. Similar to the fix for CWG1395.
       auto *TST1 = T1->castAs<TemplateSpecializationType>();
       auto *TST2 = T2->castAs<TemplateSpecializationType>();
+      const TemplateArgument &TA1 = TST1->template_arguments().back();
----------------
mizvekov wrote:
> This is a bug, T1 and T2 are not in general canonical types for this function, and this castAs can pick up an alias template, and these should never participate in deduction.
> 
> (Also, can you please add a test for that?)
> 
> You should not need to keep sugar here, everything being tested below is present on the canonical type, so this is simple to solve, as suggested.
I see. I'll add a test.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D133683/new/

https://reviews.llvm.org/D133683



More information about the cfe-commits mailing list