llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-clang Author: Akira Hatanaka (ahatanak) <details> <summary>Changes</summary> `Eval->Value.get` returns a null pointer when the variable doesn't have an initializer. This fixes https://github.com/llvm/llvm-project/issues/93625. rdar://128482541 --- Full diff: https://github.com/llvm/llvm-project/pull/93749.diff 2 Files Affected: - (modified) clang/lib/AST/Decl.cpp (+5-3) - (modified) clang/test/SemaObjCXX/block-capture.mm (+18) ``````````diff diff --git a/clang/lib/AST/Decl.cpp b/clang/lib/AST/Decl.cpp index 41fbfe281ef65..4940a787e7d30 100644 --- a/clang/lib/AST/Decl.cpp +++ b/clang/lib/AST/Decl.cpp @@ -2408,9 +2408,11 @@ Expr *VarDecl::getInit() { return cast<Expr>(S); auto *Eval = getEvaluatedStmt(); - return cast<Expr>(Eval->Value.isOffset() - ? Eval->Value.get(getASTContext().getExternalSource()) - : Eval->Value.get(nullptr)); + + return cast_or_null<Expr>( + Eval->Value.isOffset() + ? Eval->Value.get(getASTContext().getExternalSource()) + : Eval->Value.get(nullptr)); } Stmt **VarDecl::getInitAddress() { diff --git a/clang/test/SemaObjCXX/block-capture.mm b/clang/test/SemaObjCXX/block-capture.mm index 8ba02f919e015..231aef33f2c7e 100644 --- a/clang/test/SemaObjCXX/block-capture.mm +++ b/clang/test/SemaObjCXX/block-capture.mm @@ -83,3 +83,21 @@ SubMove(SubSubMove &&); }; TEST(SubMove); + + +#if __cplusplus >= 202302L +// clang used to crash compiling this code. +namespace BlockInLambda { + struct S { + constexpr ~S(); + }; + + void func(S const &a) { + [a](auto b) { + ^{ + (void)a; + }(); + }(12); + } +} +#endif `````````` </details> https://github.com/llvm/llvm-project/pull/93749 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits