[clang] [clang] Implement P2582R1: CTAD from inherited constructors (PR #98788)
Haojian Wu via cfe-commits
cfe-commits at lists.llvm.org
Wed Aug 7 13:13:57 PDT 2024
================
@@ -936,19 +940,21 @@ Expr *buildIsDeducibleConstraint(Sema &SemaRef,
Context.DeclarationNames.getCXXDeductionGuideName(AliasTemplate));
};
+ TemplateDecl *TD = DeducingTemplate ? DeducingTemplate : AliasTemplate;
+
SmallVector<TypeSourceInfo *> IsDeducibleTypeTraitArgs = {
Context.getTrivialTypeSourceInfo(
Context.getDeducedTemplateSpecializationType(
- TemplateName(AliasTemplate), /*DeducedType=*/QualType(),
+ TemplateName(TD), /*DeducedType=*/QualType(),
----------------
hokein wrote:
Thanks for the detailed analysis.
> I think you're right that the `is_deducible` constraint is technically unnecessary-- as far as I can tell, any case where this constraint would fail would cause the `CC<R>::type` instantiation to fail before the constraint is evaluated. There are some other caveats with removing it, however. Consider this example:
>
> ```c++
> template<typename T>
> struct Base1 { };
>
> template<typename T>
> struct Base2 { };
>
> template<typename T = int>
> struct Derived : public Base1<T>, Base2<T> {
> using Base1<T>::Base1;
> using Base2<T>::Base2;
> };
>
> Derived d;
> ```
>
> https://godbolt.org/z/4YcdvTMov
>
> Under [[over.match.best.general]p2.5](https://eel.is/c++draft/over.match.best.general#2.5) (and more specifically [[temp.func.order]p6.4](https://eel.is/c++draft/temp.func.order#6.4)), the bases' deduction guides are more specialized than any from `Derived` (due to the `is_deducible` constraint), and so the implementation as it is sees this as ambiguous.
Hmm, this is an interesting case. I think this is valid code, and it is accept by all compilers in C++ 20 (or before) mode. Now we reject it in C++23, this seems like a regression, https://godbolt.org/z/zxx4W36zq.
Removing the constraint seems to result in a reasonable behavior, at least this case will be compilable in C++23.
We should probably ask CWG for clarifications. @cor3ntin what's the best way to do that?
https://github.com/llvm/llvm-project/pull/98788
More information about the cfe-commits
mailing list