[clang] [clang] Fix segmentation fault caused by stack overflow on deeply nes… (PR #111701)

via cfe-commits cfe-commits at lists.llvm.org
Wed Oct 9 08:49:00 PDT 2024


llvmbot wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-clang

Author: Boaz Brickner (bricknerb)

<details>
<summary>Changes</summary>

Done by calling clang::runWithSufficientStackSpace().
Added CodeGenModule::runWithSufficientStackSpace() method similar to the one in Sema to provide a single warning when this triggers
Fixes: #<!-- -->111699 

---

Patch is 82.20 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/111701.diff


4 Files Affected:

- (modified) clang/lib/CodeGen/CGExpr.cpp (+4-1) 
- (modified) clang/lib/CodeGen/CodeGenModule.cpp (+14) 
- (modified) clang/lib/CodeGen/CodeGenModule.h (+11) 
- (added) clang/test/CodeGen/deeply-nested-expressions.cpp (+1013) 


``````````diff
diff --git a/clang/lib/CodeGen/CGExpr.cpp b/clang/lib/CodeGen/CGExpr.cpp
index 451442765620f7..5ececf7d940520 100644
--- a/clang/lib/CodeGen/CGExpr.cpp
+++ b/clang/lib/CodeGen/CGExpr.cpp
@@ -5817,7 +5817,10 @@ LValue CodeGenFunction::EmitHLSLArrayAssignLValue(const BinaryOperator *E) {
 
 LValue CodeGenFunction::EmitCallExprLValue(const CallExpr *E,
                                            llvm::CallBase **CallOrInvoke) {
-  RValue RV = EmitCallExpr(E, ReturnValueSlot(), CallOrInvoke);
+  RValue RV;
+  CGM.runWithSufficientStackSpace(E->getExprLoc(), [&] {
+    RV = EmitCallExpr(E, ReturnValueSlot(), CallOrInvoke);
+  });
 
   if (!RV.isScalar())
     return MakeAddrLValue(RV.getAggregateAddress(), E->getType(),
diff --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp
index 5ba098144a74e7..424455cbf4da39 100644
--- a/clang/lib/CodeGen/CodeGenModule.cpp
+++ b/clang/lib/CodeGen/CodeGenModule.cpp
@@ -44,6 +44,7 @@
 #include "clang/Basic/FileManager.h"
 #include "clang/Basic/Module.h"
 #include "clang/Basic/SourceManager.h"
+#include "clang/Basic/Stack.h"
 #include "clang/Basic/TargetInfo.h"
 #include "clang/Basic/Version.h"
 #include "clang/CodeGen/BackendUtil.h"
@@ -1596,6 +1597,19 @@ void CodeGenModule::ErrorUnsupported(const Decl *D, const char *Type) {
   getDiags().Report(Context.getFullLoc(D->getLocation()), DiagID) << Msg;
 }
 
+void CodeGenModule::warnStackExhausted(SourceLocation Loc) {
+  // Only warn about this once.
+  if (!WarnedStackExhausted) {
+    getDiags().Report(Loc, diag::warn_stack_exhausted);
+    WarnedStackExhausted = true;
+  }
+}
+
+void CodeGenModule::runWithSufficientStackSpace(SourceLocation Loc,
+                                                llvm::function_ref<void()> Fn) {
+  clang::runWithSufficientStackSpace([&] { warnStackExhausted(Loc); }, Fn);
+}
+
 llvm::ConstantInt *CodeGenModule::getSize(CharUnits size) {
   return llvm::ConstantInt::get(SizeTy, size.getQuantity());
 }
diff --git a/clang/lib/CodeGen/CodeGenModule.h b/clang/lib/CodeGen/CodeGenModule.h
index c58bb88035ca8a..57e06cbfac13a9 100644
--- a/clang/lib/CodeGen/CodeGenModule.h
+++ b/clang/lib/CodeGen/CodeGenModule.h
@@ -336,6 +336,7 @@ class CodeGenModule : public CodeGenTypeCache {
   std::unique_ptr<llvm::IndexedInstrProfReader> PGOReader;
   InstrProfStats PGOStats;
   std::unique_ptr<llvm::SanitizerStatReport> SanStats;
+  bool WarnedStackExhausted = false;
 
   // A set of references that have only been seen via a weakref so far. This is
   // used to remove the weak of the reference if we ever see a direct reference
@@ -1297,6 +1298,16 @@ class CodeGenModule : public CodeGenTypeCache {
   /// Print out an error that codegen doesn't support the specified decl yet.
   void ErrorUnsupported(const Decl *D, const char *Type);
 
+  /// Warn that the stack is nearly exhausted.
+  void warnStackExhausted(SourceLocation Loc);
+
+  /// Run some code with "sufficient" stack space. (Currently, at least 256K is
+  /// guaranteed). Produces a warning if we're low on stack space and allocates
+  /// more in that case. Use this in code that may recurse deeply to avoid stack
+  /// overflow.
+  void runWithSufficientStackSpace(SourceLocation Loc,
+                                   llvm::function_ref<void()> Fn);
+
   /// Set the attributes on the LLVM function for the given decl and function
   /// info. This applies attributes necessary for handling the ABI as well as
   /// user specified attributes like section.
diff --git a/clang/test/CodeGen/deeply-nested-expressions.cpp b/clang/test/CodeGen/deeply-nested-expressions.cpp
new file mode 100644
index 00000000000000..3f7b55d35ed76d
--- /dev/null
+++ b/clang/test/CodeGen/deeply-nested-expressions.cpp
@@ -0,0 +1,1013 @@
+// RUN: %clang_cc1 %s -emit-llvm -o - -Wstack-exhausted -verify
+
+class AClass {
+public:
+  AClass() {}
+  AClass &foo() { return *this; }
+};
+
+void test_bar() {
+  AClass a;
+  // expected-warning@* {{stack nearly exhausted; compilation time may suffer, and crashes due to stack overflow are likely}}
+  a.foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo().foo()
+      .foo().foo().f...
[truncated]

``````````

</details>


https://github.com/llvm/llvm-project/pull/111701


More information about the cfe-commits mailing list