[clang] 4b21905 - Fix undeduced type assert
via cfe-commits
cfe-commits at lists.llvm.org
Thu Jul 15 01:52:54 PDT 2021
Author: serge-sans-paille
Date: 2021-07-15T10:52:25+02:00
New Revision: 4b219051a331d49c391fe452548bc220bcfe8ea3
URL: https://github.com/llvm/llvm-project/commit/4b219051a331d49c391fe452548bc220bcfe8ea3
DIFF: https://github.com/llvm/llvm-project/commit/4b219051a331d49c391fe452548bc220bcfe8ea3.diff
LOG: Fix undeduced type assert
If the instantiation of a member variable makes it possible to
compute a previously undeduced type, we should use that piece of
information.
Fix bug#50590
Differential Revision: https://reviews.llvm.org/D103849
Added:
Modified:
clang/lib/AST/Expr.cpp
clang/test/CodeGenCXX/auto-variable-template.cpp
Removed:
################################################################################
diff --git a/clang/lib/AST/Expr.cpp b/clang/lib/AST/Expr.cpp
index 842b9c0a8a0e2..ebf87618e1277 100644
--- a/clang/lib/AST/Expr.cpp
+++ b/clang/lib/AST/Expr.cpp
@@ -490,6 +490,8 @@ DeclRefExpr *DeclRefExpr::CreateEmpty(const ASTContext &Context,
void DeclRefExpr::setDecl(ValueDecl *NewD) {
D = NewD;
+ if (getType()->isUndeducedType())
+ setType(NewD->getType());
setDependence(computeDependence(this, NewD->getASTContext()));
}
@@ -1722,8 +1724,10 @@ MemberExpr *MemberExpr::CreateEmpty(const ASTContext &Context,
return new (Mem) MemberExpr(EmptyShell());
}
-void MemberExpr::setMemberDecl(ValueDecl *D) {
- MemberDecl = D;
+void MemberExpr::setMemberDecl(ValueDecl *NewD) {
+ MemberDecl = NewD;
+ if (getType()->isUndeducedType())
+ setType(NewD->getType());
setDependence(computeDependence(this));
}
diff --git a/clang/test/CodeGenCXX/auto-variable-template.cpp b/clang/test/CodeGenCXX/auto-variable-template.cpp
index 79a145a73cf31..ae7154f3cb142 100644
--- a/clang/test/CodeGenCXX/auto-variable-template.cpp
+++ b/clang/test/CodeGenCXX/auto-variable-template.cpp
@@ -12,3 +12,21 @@ int main() { vtemplate<int>(); }
// CHECK: define{{.*}} i32 @main()
// CHECK: call void @_ZNK1fclEv(%struct.f* {{[^,]*}} @_Z9vtemplateIiE)
+
+template <typename>
+struct pack {
+ template <typename T>
+ constexpr static auto some_boolean_cx_value = true;
+};
+
+auto usage() {
+ return pack<char>::some_boolean_cx_value<int>;
+}
+
+// CHECK: define{{.*}} i1 @_Z5usagev()
+
+auto otherusage() {
+ return pack<char>{}.some_boolean_cx_value<int>;
+}
+
+// CHECK: define{{.*}} i1 @_Z10otherusagev()
More information about the cfe-commits
mailing list