[clang] 205b5f6 - [Serialization] Serialize the new added FunctionDeclBits: IsIneligibleOrNotSelected

Chuanqi Xu via cfe-commits cfe-commits at lists.llvm.org
Tue Jan 17 22:16:23 PST 2023


Author: Chuanqi Xu
Date: 2023-01-18T14:15:27+08:00
New Revision: 205b5f63a835bffc22dccfdaed53ee7dac504be1

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

LOG: [Serialization] Serialize the new added FunctionDeclBits: IsIneligibleOrNotSelected

Close https://github.com/llvm/llvm-project/issues/59719.

The root cause of the problem is that we forgot to serialize a new
introduced bit to FunctionDeclBits. Maybe we need to find some methods
to work for detecting this.

Added: 
    clang/test/Modules/pr59719.cppm

Modified: 
    clang/lib/Serialization/ASTReaderDecl.cpp
    clang/lib/Serialization/ASTWriterDecl.cpp

Removed: 
    


################################################################################
diff  --git a/clang/lib/Serialization/ASTReaderDecl.cpp b/clang/lib/Serialization/ASTReaderDecl.cpp
index 8173f7fb5e56..990806498c94 100644
--- a/clang/lib/Serialization/ASTReaderDecl.cpp
+++ b/clang/lib/Serialization/ASTReaderDecl.cpp
@@ -1049,6 +1049,7 @@ void ASTDeclReader::VisitFunctionDecl(FunctionDecl *FD) {
   FD->setTrivialForCall(Record.readInt());
   FD->setDefaulted(Record.readInt());
   FD->setExplicitlyDefaulted(Record.readInt());
+  FD->setIneligibleOrNotSelected(Record.readInt());
   FD->setHasImplicitReturnZero(Record.readInt());
   FD->setConstexprKind(static_cast<ConstexprSpecKind>(Record.readInt()));
   FD->setUsesSEHTry(Record.readInt());

diff  --git a/clang/lib/Serialization/ASTWriterDecl.cpp b/clang/lib/Serialization/ASTWriterDecl.cpp
index ce16ed2a3e01..ca59dd69f4fd 100644
--- a/clang/lib/Serialization/ASTWriterDecl.cpp
+++ b/clang/lib/Serialization/ASTWriterDecl.cpp
@@ -642,6 +642,7 @@ void ASTDeclWriter::VisitFunctionDecl(FunctionDecl *D) {
   Record.push_back(D->isTrivialForCall());
   Record.push_back(D->isDefaulted());
   Record.push_back(D->isExplicitlyDefaulted());
+  Record.push_back(D->isIneligibleOrNotSelected());
   Record.push_back(D->hasImplicitReturnZero());
   Record.push_back(static_cast<uint64_t>(D->getConstexprKind()));
   Record.push_back(D->usesSEHTry());
@@ -2304,6 +2305,7 @@ void ASTWriter::WriteDeclAbbrevs() {
   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // TrivialForCall
   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // Defaulted
   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // ExplicitlyDefaulted
+  Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // IsIneligibleOrNotSelected
   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // ImplicitReturnZero
   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 2)); // Constexpr
   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // UsesSEHTry

diff  --git a/clang/test/Modules/pr59719.cppm b/clang/test/Modules/pr59719.cppm
new file mode 100644
index 000000000000..5aea8992a0ca
--- /dev/null
+++ b/clang/test/Modules/pr59719.cppm
@@ -0,0 +1,57 @@
+// https://github.com/llvm/llvm-project/issues/59780
+//
+// RUN: rm -rf %t
+// RUN: mkdir %t
+// RUN: split-file %s %t
+//
+// RUN: %clang_cc1 -std=c++20 %t/data.cppm -emit-module-interface -o %t/data.pcm
+// RUN: %clang_cc1 -std=c++20 %t/main.cpp -fprebuilt-module-path=%t -fsyntax-only -verify
+
+//--- foo.h
+namespace std {
+
+template <class _Tp>
+class expected {
+public:
+  expected(_Tp&& __u)
+    {}
+
+   constexpr ~expected()
+    requires(__is_trivially_destructible(_Tp))
+  = default;
+
+   constexpr ~expected()
+    requires(!__is_trivially_destructible(_Tp))
+  {
+  }
+};
+
+template <class _Tp>
+class unique_ptr {
+public:
+   unique_ptr(void* __p) {}
+   ~unique_ptr() {}
+};
+
+}
+
+//--- data.cppm
+module;
+#include "foo.h"
+export module data;
+export namespace std {
+    using std::unique_ptr;
+    using std::expected;                    
+}
+
+export std::expected<std::unique_ptr<int>> parse() {
+  return std::unique_ptr<int>(nullptr);                                             
+}
+
+//--- main.cpp
+// expected-no-diagnostics
+import data;
+                                                                                
+int main(int argc, const char *argv[]) {                                        
+  std::expected<std::unique_ptr<int>> result = parse();                    
+}


        


More information about the cfe-commits mailing list