[clang] bcd51aa - Don't try to look up a name containing a dependent type.

Richard Smith via cfe-commits cfe-commits at lists.llvm.org
Tue Dec 13 14:43:00 PST 2022


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


        


More information about the cfe-commits mailing list