Author: Oleksandr T. Date: 2024-12-02T17:19:19+02:00 New Revision: 4ad4d34a226043a5d594b261a9c2a50efd292a76
URL: https://github.com/llvm/llvm-project/commit/4ad4d34a226043a5d594b261a9c2a50efd292a76 DIFF: https://github.com/llvm/llvm-project/commit/4ad4d34a226043a5d594b261a9c2a50efd292a76.diff LOG: Revert [Clang] prevent errors for deduction guides using deduced type aliases (#118165) Reverts https://github.com/llvm/llvm-project/pull/117450 --- Revert https://github.com/llvm/llvm-project/pull/117450 because the prior behavior aligns with the standard - _`template-name`_ in the _`simple-template-id`_ in the return type shall be the actual name of a class template rather than some equivalent alias template. Details https://github.com/llvm/llvm-project/issues/54909#issuecomment-2508418355. Added: Modified: clang/docs/ReleaseNotes.rst clang/lib/Sema/SemaDeclCXX.cpp clang/test/CXX/temp/temp.deduct.guide/p3.cpp Removed: ################################################################################ diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index e73640033f9774..08887d5ba985f5 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -626,9 +626,6 @@ Improvements to Clang's diagnostics - Fixed a false negative ``-Wunused-private-field`` diagnostic when a defaulted comparison operator is defined out of class (#GH116961). -- Clang now supports using alias templates in deduction guides, aligning with the C++ standard, - which treats alias templates as synonyms for their underlying types (#GH54909). - - Clang now diagnoses dangling references for C++20's parenthesized aggregate initialization (#101957). Improvements to Clang's time-trace diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp index c2ae9a9d5e1a0c..7e8e321c4b90e6 100644 --- a/clang/lib/Sema/SemaDeclCXX.cpp +++ b/clang/lib/Sema/SemaDeclCXX.cpp @@ -11451,29 +11451,23 @@ bool Sema::CheckDeductionGuideDeclarator(Declarator &D, QualType &R, bool MightInstantiateToSpecialization = false; if (auto RetTST = TSI->getTypeLoc().getAsAdjusted<TemplateSpecializationTypeLoc>()) { - const TemplateSpecializationType *TST = RetTST.getTypePtr(); - while (TST && TST->isTypeAlias()) - TST = TST->getAliasedType()->getAs<TemplateSpecializationType>(); - - if (TST) { - TemplateName SpecifiedName = TST->getTemplateName(); - bool TemplateMatches = Context.hasSameTemplateName( - SpecifiedName, GuidedTemplate, /*IgnoreDeduced=*/true); - - const QualifiedTemplateName *Qualifiers = - SpecifiedName.getAsQualifiedTemplateName(); - assert(Qualifiers && "expected QualifiedTemplate"); - bool SimplyWritten = !Qualifiers->hasTemplateKeyword() && - Qualifiers->getQualifier() == nullptr; - if (SimplyWritten && TemplateMatches) - AcceptableReturnType = true; - else { - // This could still instantiate to the right type, unless we know it - // names the wrong class template. - auto *TD = SpecifiedName.getAsTemplateDecl(); - MightInstantiateToSpecialization = - !(TD && isa<ClassTemplateDecl>(TD) && !TemplateMatches); - } + TemplateName SpecifiedName = RetTST.getTypePtr()->getTemplateName(); + bool TemplateMatches = Context.hasSameTemplateName( + SpecifiedName, GuidedTemplate, /*IgnoreDeduced=*/true); + + const QualifiedTemplateName *Qualifiers = + SpecifiedName.getAsQualifiedTemplateName(); + assert(Qualifiers && "expected QualifiedTemplate"); + bool SimplyWritten = !Qualifiers->hasTemplateKeyword() && + Qualifiers->getQualifier() == nullptr; + if (SimplyWritten && TemplateMatches) + AcceptableReturnType = true; + else { + // This could still instantiate to the right type, unless we know it + // names the wrong class template. + auto *TD = SpecifiedName.getAsTemplateDecl(); + MightInstantiateToSpecialization = + !(TD && isa<ClassTemplateDecl>(TD) && !TemplateMatches); } } else if (!RetTy.hasQualifiers() && RetTy->isDependentType()) { MightInstantiateToSpecialization = true; diff --git a/clang/test/CXX/temp/temp.deduct.guide/p3.cpp b/clang/test/CXX/temp/temp.deduct.guide/p3.cpp index 195ba2831439d0..c5404847beb066 100644 --- a/clang/test/CXX/temp/temp.deduct.guide/p3.cpp +++ b/clang/test/CXX/temp/temp.deduct.guide/p3.cpp @@ -33,7 +33,7 @@ template<template<typename> typename TT> struct E { // expected-note 2{{template }; A(int) -> int; // expected-error {{deduced type 'int' of deduction guide is not a specialization of template 'A'}} -template <typename T> A(T)->B<T>; +template <typename T> A(T)->B<T>; // expected-error {{deduced type 'B<T>' (aka 'A<T>') of deduction guide is not written as a specialization of template 'A'}} template<typename T> A(T*) -> const A<T>; // expected-error {{deduced type 'const A<T>' of deduction guide is not a specialization of template 'A'}} // A deduction-guide shall be declared in the same scope as the corresponding @@ -71,11 +71,3 @@ namespace WrongScope { Local(int) -> Local<int>; // expected-error {{expected}} } } - -namespace GH54909 { -template <class T> struct A {}; -struct B {}; - -template <typename T> using C = B; -template <typename T> A() -> C<T>; // expected-error {{deduced type 'C<T>' (aka 'GH54909::B') of deduction guide is not a specialization of template 'A'}} -} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits