From 8f768ec00592009cda496c8f7bfeef013887b5f3 Mon Sep 17 00:00:00 2001 From: Shafik Yaghmour Date: Thu, 28 Sep 2023 12:20:22 -0700 Subject: [PATCH] [Clang] Fix crash when visting a fold expression in a default argument (#67514) CheckDefaultArgumentVisitor::Visit(...) assumes that the children of Expr will not be NULL. This is not a valid assumption and when we have a CXXFoldExpr the children can be NULL and this causes a crash. Fixes: https://github.com/llvm/llvm-project/issues/67395 --- clang/docs/ReleaseNotes.rst | 4 ++++ clang/lib/Sema/SemaDeclCXX.cpp | 3 ++- clang/test/SemaTemplate/cxx1z-fold-expressions.cpp | 8 ++++++++ 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index f314c9c72fa2..1d74c492845a 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -363,6 +363,10 @@ Bug Fixes to C++ Support in the enclosing expression of a lambda expression with a noexcept specifier. (`#67492 `_) +- Fix crash when fold expression was used in the initialization of default + argument. Fixes: + (`#67395 `_) + Bug Fixes to AST Handling ^^^^^^^^^^^^^^^^^^^^^^^^^ - Fixed an import failure of recursive friend class template. diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp index 0091e0ecf6f3..302e944d5d74 100644 --- a/clang/lib/Sema/SemaDeclCXX.cpp +++ b/clang/lib/Sema/SemaDeclCXX.cpp @@ -86,7 +86,8 @@ public: bool CheckDefaultArgumentVisitor::VisitExpr(const Expr *Node) { bool IsInvalid = false; for (const Stmt *SubStmt : Node->children()) - IsInvalid |= Visit(SubStmt); + if (SubStmt) + IsInvalid |= Visit(SubStmt); return IsInvalid; } diff --git a/clang/test/SemaTemplate/cxx1z-fold-expressions.cpp b/clang/test/SemaTemplate/cxx1z-fold-expressions.cpp index 518eaf0e0523..47a252eb335f 100644 --- a/clang/test/SemaTemplate/cxx1z-fold-expressions.cpp +++ b/clang/test/SemaTemplate/cxx1z-fold-expressions.cpp @@ -124,3 +124,11 @@ namespace PR30738 { int test_h3 = h(1, 2, 3); N::S test_h4 = h(N::S(), N::S(), N::S()); // expected-note {{instantiation of}} } + +namespace GH67395 { +template +bool f(); + +template +void g(bool = (f() || ...)); +}