Author: Dmitry Polukhin Date: 2022-09-17T07:37:19-07:00 New Revision: 133b6d7db90d9b52b01e8e09e1aa8fb8d2da0f9d
URL: https://github.com/llvm/llvm-project/commit/133b6d7db90d9b52b01e8e09e1aa8fb8d2da0f9d DIFF: https://github.com/llvm/llvm-project/commit/133b6d7db90d9b52b01e8e09e1aa8fb8d2da0f9d.diff LOG: [clang][C++20] Fix clang/clangd assert/crash after compilation errors After compilation errors, expression a transformation result may not be usable. It triggers an assert in RemoveNestedImmediateInvocation and SIGSEGV in case of builds without asserts. This issue significantly affects clangd because source may not be valid during typing. Tests cases that I attached was reduce from huge C++ translation unit. Test Plan: check-clang Differential Revision: https://reviews.llvm.org/D133948 Added: clang/test/SemaCXX/remove-nested-immediate-invocation-crash.cpp Modified: clang/lib/Sema/SemaExpr.cpp Removed: ################################################################################ diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index e53c88b283b8..b49b7ce45cf4 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -17624,9 +17624,13 @@ static void RemoveNestedImmediateInvocation( Transformer.AllowSkippingFirstCXXConstructExpr = false; ExprResult Res = Transformer.TransformExpr(It->getPointer()->getSubExpr()); - assert(Res.isUsable()); - Res = SemaRef.MaybeCreateExprWithCleanups(Res); - It->getPointer()->setSubExpr(Res.get()); + // The result may not be usable in case of previous compilation errors. + // In this case evaluation of the expression may result in crash so just + // don't do anything further with the result. + if (Res.isUsable()) { + Res = SemaRef.MaybeCreateExprWithCleanups(Res); + It->getPointer()->setSubExpr(Res.get()); + } } static void diff --git a/clang/test/SemaCXX/remove-nested-immediate-invocation-crash.cpp b/clang/test/SemaCXX/remove-nested-immediate-invocation-crash.cpp new file mode 100644 index 000000000000..26faf2bc1c06 --- /dev/null +++ b/clang/test/SemaCXX/remove-nested-immediate-invocation-crash.cpp @@ -0,0 +1,11 @@ +// RUN: not %clang_cc1 -fsyntax-only -verify -std=gnu++20 -ferror-limit 19 %s +// Creduced test case for the crash in RemoveNestedImmediateInvocation after compliation errros. + +a, class b { template < typename c> consteval b(c +} template <typename...> using d = b; +auto e(d<>) -> int:; +} +f +} +g() { + auto h = "":(::i(e(h)) _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits