Author: Richard Smith Date: 2022-12-13T14:42:51-08:00 New Revision: bcd51aaaf8bde4b0ae7a4155d9ce3dec78fe2598
URL: https://github.com/llvm/llvm-project/commit/bcd51aaaf8bde4b0ae7a4155d9ce3dec78fe2598 DIFF: https://github.com/llvm/llvm-project/commit/bcd51aaaf8bde4b0ae7a4155d9ce3dec78fe2598.diff LOG: Don't try to look up a name containing a dependent type. Template instantiation can create names that are still dependent, such as `operator T`. Don't assume that they can be looked up immediately, and instead defer lookup for such names until we know what `T` is. Added: Modified: clang/lib/Sema/SemaExpr.cpp clang/test/SemaCXX/conversion-function.cpp Removed: ################################################################################ diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index 2d48b6f571b2d..e568cc5ca0546 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -2736,6 +2736,10 @@ Sema::ActOnIdExpression(Scope *S, CXXScopeSpec &SS, ExprResult Sema::BuildQualifiedDeclarationNameExpr( CXXScopeSpec &SS, const DeclarationNameInfo &NameInfo, bool IsAddressOfOperand, const Scope *S, TypeSourceInfo **RecoveryTSI) { + if (NameInfo.getName().isDependentName()) + return BuildDependentDeclRefExpr(SS, /*TemplateKWLoc=*/SourceLocation(), + NameInfo, /*TemplateArgs=*/nullptr); + DeclContext *DC = computeDeclContext(SS, false); if (!DC) return BuildDependentDeclRefExpr(SS, /*TemplateKWLoc=*/SourceLocation(), diff --git a/clang/test/SemaCXX/conversion-function.cpp b/clang/test/SemaCXX/conversion-function.cpp index 0d6c1f3064dd8..01b82e1540db4 100644 --- a/clang/test/SemaCXX/conversion-function.cpp +++ b/clang/test/SemaCXX/conversion-function.cpp @@ -472,3 +472,16 @@ struct S { operator const int() const; }; } + +#if __cplusplus >= 201103L +namespace dependent_conversion_function_id_lookup { + template<typename T> struct A { + operator T(); + }; + template<typename T> struct B : A<T> { + template<typename U> using Lookup = decltype(&B::operator U); + }; + using Result = B<int>::Lookup<int>; + using Result = int (A<int>::*)(); +} +#endif _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits