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() _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits