================ @@ -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:
```cpp template <typename T> struct B { B(T); }; template <typename T> struct C : public B<T> { using B<T>::B; }; C c(1); // implicit code // template <typename> class CC; // // template <typename T> // class CC<B<T>> { // public: // typedef C<T> type; // }; ``` If I read the code correctly, we will build the `__is_deducible(C, typename CC<B<T>>::type)` for the deduction guide of `C` (`auto (T) -> typename CC<B<T>>::type`). I'm not sure this is correct. Intuitively, this constraint is not necessary, if `CC<B<T>>::type` is valid, it must be the type of `C<T>`, then `is_deducible(C, C<T>)` is always true. Unfortunately, the standard doesn't specify the transformation of the associated constraint (oversight?). If we only replace the return type, then the constraint will be `is_deducible(B, typename CC<B<T>>::type)` which is always false. Perhaps we should always drop the `is_deducible` constraint for this case. https://github.com/llvm/llvm-project/pull/98788 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits