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.
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());
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());
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
--- /dev/null
+// 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();
+}