[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