[clang] Reland [C++20] [Modules] Don't profiling the callee of CXXFoldExpr (#190732) (PR #195983)

Chuanqi Xu via cfe-commits cfe-commits at lists.llvm.org
Tue May 5 22:30:06 PDT 2026


================
@@ -2400,7 +2400,37 @@ void StmtProfiler::VisitMaterializeTemporaryExpr(
 }
 
 void StmtProfiler::VisitCXXFoldExpr(const CXXFoldExpr *S) {
-  VisitExpr(S);
+  VisitStmtNoChildren(S);
+  // We intentionally not profile the callee sub-expression
+  // to keep the profiling result stable across different
+  // context.
+  //
+  // "a.h"
+  //
+  //   struct F {
+  //     template <typename... T> requires ((sizeof(T) > 0) && ...)
+  //     void operator()(T...) {}
+  //   } f;
+  //
+  // and
+  //
+  // "c.h"
+  //
+  //   void operator&&(struct X, struct X);
+  //   #include "a.h"
+  //
+  // Here we might give different profiling results if we profile
+  // the callee sub-expression, which is nullptr in the first case
+  // an UnresolvedLookupExpr in the second case where there is a
+  // global operator&& operator that pollutes the fold expression.
+  if (S->getLHS())
+    Visit(S->getLHS());
+  else
+    ID.AddInteger(0);
+  if (S->getRHS())
+    Visit(S->getRHS());
+  else
+    ID.AddInteger(0);
----------------
ChuanqiXu9 wrote:

Done. Thanks.

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


More information about the cfe-commits mailing list