[clang] [C++20][Modules] Disable preferred_name when writing a C++20 header unit (PR #144377)
Dmitry Polukhin via cfe-commits
cfe-commits at lists.llvm.org
Mon Jun 16 08:46:17 PDT 2025
https://github.com/dmpolukhin created https://github.com/llvm/llvm-project/pull/144377
https://reviews.llvm.org/D130331 added workaround for named modules only. But the same issue happens for headees units. Link issue #56490
>From 107a61c1c7a2caf3a3801c36637f4393ba613255 Mon Sep 17 00:00:00 2001
From: Dmitry Polukhin <dmitry.polukhin at gmail.com>
Date: Mon, 16 Jun 2025 08:34:57 -0700
Subject: [PATCH] [C++20][Modules] Disable preferred_name when writing a C++20
header unit
https://reviews.llvm.org/D130331 added workaround for named modules only.
But the same issue happens for headees units. Link issue #56490
---
clang/include/clang/Serialization/ASTWriter.h | 4 ++
clang/lib/Serialization/ASTWriter.cpp | 5 +-
.../Modules/preferred_name_header_unit.cpp | 64 +++++++++++++++++++
3 files changed, 71 insertions(+), 2 deletions(-)
create mode 100644 clang/test/Modules/preferred_name_header_unit.cpp
diff --git a/clang/include/clang/Serialization/ASTWriter.h b/clang/include/clang/Serialization/ASTWriter.h
index cf4ae610ea51f..0f49646f3f022 100644
--- a/clang/include/clang/Serialization/ASTWriter.h
+++ b/clang/include/clang/Serialization/ASTWriter.h
@@ -899,6 +899,10 @@ class ASTWriter : public ASTDeserializationListener,
return WritingModule && WritingModule->isNamedModule();
}
+ bool isWritingStdCXXHeaderUnit() const {
+ return WritingModule && WritingModule->isHeaderUnit();
+ }
+
bool isGeneratingReducedBMI() const { return GeneratingReducedBMI; }
bool getDoneWritingDeclsAndTypes() const { return DoneWritingDeclsAndTypes; }
diff --git a/clang/lib/Serialization/ASTWriter.cpp b/clang/lib/Serialization/ASTWriter.cpp
index ab1b5b333e06a..be22ee5221911 100644
--- a/clang/lib/Serialization/ASTWriter.cpp
+++ b/clang/lib/Serialization/ASTWriter.cpp
@@ -5167,8 +5167,9 @@ void ASTRecordWriter::AddAttr(const Attr *A) {
// FIXME: Clang can't handle the serialization/deserialization of
// preferred_name properly now. See
// https://github.com/llvm/llvm-project/issues/56490 for example.
- if (!A || (isa<PreferredNameAttr>(A) &&
- Writer->isWritingStdCXXNamedModules()))
+ if (!A ||
+ (isa<PreferredNameAttr>(A) && (Writer->isWritingStdCXXNamedModules() ||
+ Writer->isWritingStdCXXHeaderUnit())))
return Record.push_back(0);
Record.push_back(A->getKind() + 1); // FIXME: stable encoding, target attrs
diff --git a/clang/test/Modules/preferred_name_header_unit.cpp b/clang/test/Modules/preferred_name_header_unit.cpp
new file mode 100644
index 0000000000000..b1f1e3579f31e
--- /dev/null
+++ b/clang/test/Modules/preferred_name_header_unit.cpp
@@ -0,0 +1,64 @@
+// RUN: rm -fR %t
+// RUN: split-file %s %t
+// RUN: cd %t
+// RUN: %clang_cc1 -verify -w -std=c++20 -fmodule-name=h1.h -emit-header-unit -xc++-user-header h1.h -o h1.pcm
+// RUN: %clang_cc1 -verify -w -std=c++20 -fmodule-map-file=module.modulemap -fmodule-file=h1.h=h1.pcm main.cpp -o main.o
+
+//--- module.modulemap
+module "h1.h" {
+ header "h1.h"
+ export *
+}
+
+//--- h0.h
+// expected-no-diagnostics
+#pragma once
+namespace std {
+
+template <class _CharT, class = _CharT, class = _CharT> class basic_string;
+
+namespace pmr {
+using string = basic_string<char>;
+}
+
+template <class, class, class>
+class __attribute__((__preferred_name__(pmr::string))) basic_string;
+
+template <class> class basic_string_view {};
+
+template <class _CharT, class _Traits, class _Allocator> class basic_string {
+ typedef _CharT value_type;
+ typedef _Allocator allocator_type;
+ struct __rep;
+public:
+ template <class _Tp>
+ basic_string(_Tp) {}
+ basic_string operator+=(value_type);
+};
+
+namespace filesystem {
+class path {
+ typedef char value_type;
+ value_type preferred_separator;
+ typedef basic_string<value_type> string_type;
+ typedef basic_string_view<value_type> __string_view;
+ template <class _Source> void append(_Source) {
+ __pn_ += preferred_separator;
+ }
+ void __root_directory() { append(string_type(__string_view{})); }
+ string_type __pn_;
+};
+} // namespace filesystem
+} // namespace std
+
+//--- h1.h
+// expected-no-diagnostics
+#pragma once
+
+#include "h0.h"
+
+//--- main.cpp
+// expected-no-diagnostics
+#include "h0.h"
+
+import "h1.h";
More information about the cfe-commits
mailing list