From 4b219051a331d49c391fe452548bc220bcfe8ea3 Mon Sep 17 00:00:00 2001 From: serge-sans-paille Date: Mon, 7 Jun 2021 17:14:43 +0200 Subject: [PATCH] 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 --- clang/lib/AST/Expr.cpp | 8 ++++++-- clang/test/CodeGenCXX/auto-variable-template.cpp | 18 ++++++++++++++++++ 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/clang/lib/AST/Expr.cpp b/clang/lib/AST/Expr.cpp index 842b9c0..ebf8761 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 79a145a..ae7154f3 100644 --- a/clang/test/CodeGenCXX/auto-variable-template.cpp +++ b/clang/test/CodeGenCXX/auto-variable-template.cpp @@ -12,3 +12,21 @@ int main() { vtemplate(); } // CHECK: define{{.*}} i32 @main() // CHECK: call void @_ZNK1fclEv(%struct.f* {{[^,]*}} @_Z9vtemplateIiE) + +template +struct pack { + template + constexpr static auto some_boolean_cx_value = true; +}; + +auto usage() { + return pack::some_boolean_cx_value; +} + +// CHECK: define{{.*}} i1 @_Z5usagev() + +auto otherusage() { + return pack{}.some_boolean_cx_value; +} + +// CHECK: define{{.*}} i1 @_Z10otherusagev() -- 2.7.4