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.poluk...@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"; _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits