MitalAshok updated this revision to Diff 543697. MitalAshok added a comment.
Remove now unneeded FIXME Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D156064/new/ https://reviews.llvm.org/D156064 Files: clang/docs/ReleaseNotes.rst clang/lib/Sema/SemaDeclCXX.cpp clang/lib/Sema/SemaInit.cpp clang/test/SemaCXX/cxx1z-class-template-argument-deduction.cpp Index: clang/test/SemaCXX/cxx1z-class-template-argument-deduction.cpp =================================================================== --- clang/test/SemaCXX/cxx1z-class-template-argument-deduction.cpp +++ clang/test/SemaCXX/cxx1z-class-template-argument-deduction.cpp @@ -12,8 +12,6 @@ size_t n; initializer_list(); }; - // FIXME: This should probably not be necessary. - template<typename T> initializer_list(initializer_list<T>) -> initializer_list<T>; } template<typename T> constexpr bool has_type(...) { return false; } Index: clang/lib/Sema/SemaInit.cpp =================================================================== --- clang/lib/Sema/SemaInit.cpp +++ clang/lib/Sema/SemaInit.cpp @@ -10589,8 +10589,6 @@ // FIXME: Perform "exact type" matching first, per CWG discussion? // Or implement this via an implied 'T(T) -> T' deduction guide? - // FIXME: Do we need/want a std::initializer_list<T> special case? - // Look up deduction guides, including those synthesized from constructors. // // C++1z [over.match.class.deduct]p1: Index: clang/lib/Sema/SemaDeclCXX.cpp =================================================================== --- clang/lib/Sema/SemaDeclCXX.cpp +++ clang/lib/Sema/SemaDeclCXX.cpp @@ -11703,11 +11703,17 @@ Template = Specialization->getSpecializedTemplate(); Arguments = Specialization->getTemplateArgs().data(); - } else if (const TemplateSpecializationType *TST = - Ty->getAs<TemplateSpecializationType>()) { - Template = dyn_cast_or_null<ClassTemplateDecl>( - TST->getTemplateName().getAsTemplateDecl()); - Arguments = TST->template_arguments().begin(); + } else { + const TemplateSpecializationType *TST = nullptr; + if (auto *ICN = Ty->getAs<InjectedClassNameType>()) + TST = ICN->getInjectedTST(); + else + TST = Ty->getAs<TemplateSpecializationType>(); + if (TST) { + Template = dyn_cast_or_null<ClassTemplateDecl>( + TST->getTemplateName().getAsTemplateDecl()); + Arguments = TST->template_arguments().begin(); + } } if (!Template) return false; Index: clang/docs/ReleaseNotes.rst =================================================================== --- clang/docs/ReleaseNotes.rst +++ clang/docs/ReleaseNotes.rst @@ -789,6 +789,9 @@ (`#63903 <https://github.com/llvm/llvm-project/issues/63903>`_) - Fix constraint checking of non-generic lambdas. (`#63181 <https://github.com/llvm/llvm-project/issues/63181>`_) +- Fix CTAD for ``std::initializer_list``. This allows + ``std::initializer_list{1, 2, 3}`` to be a ``std::initializer_list<int>`` + as intended. Bug Fixes to AST Handling ^^^^^^^^^^^^^^^^^^^^^^^^^
Index: clang/test/SemaCXX/cxx1z-class-template-argument-deduction.cpp =================================================================== --- clang/test/SemaCXX/cxx1z-class-template-argument-deduction.cpp +++ clang/test/SemaCXX/cxx1z-class-template-argument-deduction.cpp @@ -12,8 +12,6 @@ size_t n; initializer_list(); }; - // FIXME: This should probably not be necessary. - template<typename T> initializer_list(initializer_list<T>) -> initializer_list<T>; } template<typename T> constexpr bool has_type(...) { return false; } Index: clang/lib/Sema/SemaInit.cpp =================================================================== --- clang/lib/Sema/SemaInit.cpp +++ clang/lib/Sema/SemaInit.cpp @@ -10589,8 +10589,6 @@ // FIXME: Perform "exact type" matching first, per CWG discussion? // Or implement this via an implied 'T(T) -> T' deduction guide? - // FIXME: Do we need/want a std::initializer_list<T> special case? - // Look up deduction guides, including those synthesized from constructors. // // C++1z [over.match.class.deduct]p1: Index: clang/lib/Sema/SemaDeclCXX.cpp =================================================================== --- clang/lib/Sema/SemaDeclCXX.cpp +++ clang/lib/Sema/SemaDeclCXX.cpp @@ -11703,11 +11703,17 @@ Template = Specialization->getSpecializedTemplate(); Arguments = Specialization->getTemplateArgs().data(); - } else if (const TemplateSpecializationType *TST = - Ty->getAs<TemplateSpecializationType>()) { - Template = dyn_cast_or_null<ClassTemplateDecl>( - TST->getTemplateName().getAsTemplateDecl()); - Arguments = TST->template_arguments().begin(); + } else { + const TemplateSpecializationType *TST = nullptr; + if (auto *ICN = Ty->getAs<InjectedClassNameType>()) + TST = ICN->getInjectedTST(); + else + TST = Ty->getAs<TemplateSpecializationType>(); + if (TST) { + Template = dyn_cast_or_null<ClassTemplateDecl>( + TST->getTemplateName().getAsTemplateDecl()); + Arguments = TST->template_arguments().begin(); + } } if (!Template) return false; Index: clang/docs/ReleaseNotes.rst =================================================================== --- clang/docs/ReleaseNotes.rst +++ clang/docs/ReleaseNotes.rst @@ -789,6 +789,9 @@ (`#63903 <https://github.com/llvm/llvm-project/issues/63903>`_) - Fix constraint checking of non-generic lambdas. (`#63181 <https://github.com/llvm/llvm-project/issues/63181>`_) +- Fix CTAD for ``std::initializer_list``. This allows + ``std::initializer_list{1, 2, 3}`` to be a ``std::initializer_list<int>`` + as intended. Bug Fixes to AST Handling ^^^^^^^^^^^^^^^^^^^^^^^^^
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits