From 205b5f63a835bffc22dccfdaed53ee7dac504be1 Mon Sep 17 00:00:00 2001 From: Chuanqi Xu Date: Tue, 17 Jan 2023 17:05:52 +0800 Subject: [PATCH] [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. --- clang/lib/Serialization/ASTReaderDecl.cpp | 1 + clang/lib/Serialization/ASTWriterDecl.cpp | 2 ++ clang/test/Modules/pr59719.cppm | 57 +++++++++++++++++++++++++++++++ 3 files changed, 60 insertions(+) create mode 100644 clang/test/Modules/pr59719.cppm diff --git a/clang/lib/Serialization/ASTReaderDecl.cpp b/clang/lib/Serialization/ASTReaderDecl.cpp index 8173f7f..9908064 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(Record.readInt())); FD->setUsesSEHTry(Record.readInt()); diff --git a/clang/lib/Serialization/ASTWriterDecl.cpp b/clang/lib/Serialization/ASTWriterDecl.cpp index ce16ed2..ca59dd6 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(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 0000000..5aea899 --- /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 expected { +public: + expected(_Tp&& __u) + {} + + constexpr ~expected() + requires(__is_trivially_destructible(_Tp)) + = default; + + constexpr ~expected() + requires(!__is_trivially_destructible(_Tp)) + { + } +}; + +template +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> parse() { + return std::unique_ptr(nullptr); +} + +//--- main.cpp +// expected-no-diagnostics +import data; + +int main(int argc, const char *argv[]) { + std::expected> result = parse(); +} -- 2.7.4