https://github.com/HerrCai0907 updated https://github.com/llvm/llvm-project/pull/77587
>From f6b9afa26fabb5f9dcea5615c92914bed93ef474 Mon Sep 17 00:00:00 2001 From: Congcong Cai <congcongcai0...@163.com> Date: Wed, 10 Jan 2024 19:27:31 +0800 Subject: [PATCH 1/2] [clang]not lookup name containing a dependent type Fixes: #77583 bcd51aaaf8bde4b0ae7a4155d9ce3dec78fe2598 fixed part of template instantiation dependent name issues but still missing some cases This patch want to enhance the dependent name check --- clang/lib/Sema/SemaExprMember.cpp | 3 ++- clang/test/SemaCXX/conversion-function.cpp | 14 +++++++++++--- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/clang/lib/Sema/SemaExprMember.cpp b/clang/lib/Sema/SemaExprMember.cpp index 2abec3d86a27d9..32998ae60eafe2 100644 --- a/clang/lib/Sema/SemaExprMember.cpp +++ b/clang/lib/Sema/SemaExprMember.cpp @@ -782,7 +782,8 @@ Sema::BuildMemberReferenceExpr(Expr *Base, QualType BaseType, const Scope *S, ActOnMemberAccessExtraArgs *ExtraArgs) { if (BaseType->isDependentType() || - (SS.isSet() && isDependentScopeSpecifier(SS))) + (SS.isSet() && isDependentScopeSpecifier(SS)) || + NameInfo.getName().isDependentName()) return ActOnDependentMemberExpr(Base, BaseType, IsArrow, OpLoc, SS, TemplateKWLoc, FirstQualifierInScope, diff --git a/clang/test/SemaCXX/conversion-function.cpp b/clang/test/SemaCXX/conversion-function.cpp index b6e6142d179066..220ae78f2d8246 100644 --- a/clang/test/SemaCXX/conversion-function.cpp +++ b/clang/test/SemaCXX/conversion-function.cpp @@ -475,13 +475,21 @@ struct S { #if __cplusplus >= 201103L namespace dependent_conversion_function_id_lookup { - template<typename T> struct A { + struct A1 { + operator int(); + }; + template<class T> struct C { + template <typename U> using Lookup = decltype(T{}.operator U()); + }; + C<A1> v{}; + + template<typename T> struct A2 { operator T(); }; - template<typename T> struct B : A<T> { + template<typename T> struct B : A2<T> { template<typename U> using Lookup = decltype(&B::operator U); }; using Result = B<int>::Lookup<int>; - using Result = int (A<int>::*)(); + using Result = int (A2<int>::*)(); } #endif >From e48e981d65502948972d091c612ee7a354abb3d0 Mon Sep 17 00:00:00 2001 From: Congcong Cai <congcongcai0...@163.com> Date: Thu, 11 Jan 2024 18:39:31 +0800 Subject: [PATCH 2/2] add release note --- clang/docs/ReleaseNotes.rst | 4 ++- clang/test/SemaCXX/conversion-function.cpp | 33 +++++++++++----------- 2 files changed, 20 insertions(+), 17 deletions(-) diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index 37f8bbc89d8949..8e403530a19502 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -708,7 +708,9 @@ Bug Fixes in This Version - Clang now emits correct source location for code-coverage regions in `if constexpr` and `if consteval` branches. Fixes (`#54419 <https://github.com/llvm/llvm-project/issues/54419>`_) - +- Fix an issue where clang cannot find conversion function with template + parameter when instantiation of template class. + Fixes (`#77583 <https://github.com/llvm/llvm-project/issues/77583>`_) Bug Fixes to Compiler Builtins ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/clang/test/SemaCXX/conversion-function.cpp b/clang/test/SemaCXX/conversion-function.cpp index 220ae78f2d8246..749e2fc1b452b6 100644 --- a/clang/test/SemaCXX/conversion-function.cpp +++ b/clang/test/SemaCXX/conversion-function.cpp @@ -475,21 +475,22 @@ struct S { #if __cplusplus >= 201103L namespace dependent_conversion_function_id_lookup { - struct A1 { - operator int(); - }; - template<class T> struct C { - template <typename U> using Lookup = decltype(T{}.operator U()); - }; - C<A1> v{}; - - template<typename T> struct A2 { - operator T(); - }; - template<typename T> struct B : A2<T> { - template<typename U> using Lookup = decltype(&B::operator U); - }; - using Result = B<int>::Lookup<int>; - using Result = int (A2<int>::*)(); +namespace gh77583 { +struct A1 { + operator int(); +}; +template<class T> struct C { + template <typename U> using Lookup = decltype(T{}.operator U()); +}; +C<A1> v{}; +} +template<typename T> struct A2 { + operator T(); +}; +template<typename T> struct B : A2<T> { + template<typename U> using Lookup = decltype(&B::operator U); +}; +using Result = B<int>::Lookup<int>; +using Result = int (A2<int>::*)(); } #endif _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits