[clang] a0ce3e6 - [C++20] [Modules] Avoid crash with calls to (this auto) syntax

Chuanqi Xu via cfe-commits cfe-commits at lists.llvm.org
Tue Jun 24 23:13:25 PDT 2025


Author: Chuanqi Xu
Date: 2025-06-25T14:12:32+08:00
New Revision: a0ce3e691c199145b55b6a7f86468b438eb14264

URL: https://github.com/llvm/llvm-project/commit/a0ce3e691c199145b55b6a7f86468b438eb14264
DIFF: https://github.com/llvm/llvm-project/commit/a0ce3e691c199145b55b6a7f86468b438eb14264.diff

LOG: [C++20] [Modules] Avoid crash with calls to (this auto) syntax

Due to we didn't consider (this, auto) information when setting abbrev
for calls, we use incorrect format for calls, which cause crashes.

From
https://github.com/llvm/llvm-project/issues/118137

Added: 
    clang/test/Modules/pr118137.cppm

Modified: 
    clang/lib/Serialization/ASTWriterStmt.cpp

Removed: 
    


################################################################################
diff  --git a/clang/lib/Serialization/ASTWriterStmt.cpp b/clang/lib/Serialization/ASTWriterStmt.cpp
index a6e320c7f3eb0..87536be8c8d98 100644
--- a/clang/lib/Serialization/ASTWriterStmt.cpp
+++ b/clang/lib/Serialization/ASTWriterStmt.cpp
@@ -971,7 +971,7 @@ void ASTStmtWriter::VisitCallExpr(CallExpr *E) {
     Record.push_back(E->getFPFeatures().getAsOpaqueInt());
 
   if (!E->hasStoredFPFeatures() && !static_cast<bool>(E->getADLCallKind()) &&
-      E->getStmtClass() == Stmt::CallExprClass)
+      !E->usesMemberSyntax() && E->getStmtClass() == Stmt::CallExprClass)
     AbbrevToUse = Writer.getCallExprAbbrev();
 
   Code = serialization::EXPR_CALL;

diff  --git a/clang/test/Modules/pr118137.cppm b/clang/test/Modules/pr118137.cppm
new file mode 100644
index 0000000000000..38e35399b05c0
--- /dev/null
+++ b/clang/test/Modules/pr118137.cppm
@@ -0,0 +1,24 @@
+// RUN: rm -rf %t
+// RUN: mkdir -p %t
+// RUN: split-file %s %t
+//
+// RUN: %clang_cc1 -std=c++23 %t/a.cppm -emit-module-interface -o %t/a.pcm
+// RUN: %clang_cc1 -std=c++23 %t/a.cppm -emit-reduced-module-interface -o %t/a.pcm
+// RUN: %clang_cc1 -std=c++23 %t/a.cppm -emit-llvm -o -
+
+//--- a.h
+typedef int nghttp2_session_callbacks;
+
+//--- a.cppm
+module;
+#include "a.h"
+export module g;
+template <typename, typename T>
+concept Deleter = requires(T ptr) { ptr; };
+template <typename T, Deleter<T>> struct Handle {
+  void GetRaw(this auto);
+};
+struct SessionCallbacksDeleter
+    : Handle<nghttp2_session_callbacks, SessionCallbacksDeleter> {
+} Server_callbacks;
+void Server() { Server_callbacks.GetRaw(); }


        


More information about the cfe-commits mailing list