Author: Iain Sandoe Date: 2023-01-21T12:55:52Z New Revision: ff70e22f08d9a289c707ef192d7d4c5968e54b51
URL: https://github.com/llvm/llvm-project/commit/ff70e22f08d9a289c707ef192d7d4c5968e54b51 DIFF: https://github.com/llvm/llvm-project/commit/ff70e22f08d9a289c707ef192d7d4c5968e54b51.diff LOG: [C++20][Modules] Handle defaulted and deleted functions in header units. Address part of https://github.com/llvm/llvm-project/issues/60079. Deleted and Defaulted functions are implicitly inline, but that state is not set at the point that we perform the diagnostic checks for externally- visible non-inline functions; check the function body type explicitly in the diagnostic. Differential Revision: https://reviews.llvm.org/D141908 Added: Modified: clang/lib/Sema/SemaDecl.cpp clang/test/CXX/module/module.import/p6.cpp Removed: ################################################################################ diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp index 3ae3e33a6704..e2b921bfe78f 100644 --- a/clang/lib/Sema/SemaDecl.cpp +++ b/clang/lib/Sema/SemaDecl.cpp @@ -15254,9 +15254,15 @@ Decl *Sema::ActOnStartOfFunctionDef(Scope *FnBodyScope, Decl *D, } // C++ [module.import/6] external definitions are not permitted in header - // units. + // units. Deleted and Defaulted functions are implicitly inline (but the + // inline state is not set at this point, so check the BodyKind explicitly). + // FIXME: Consider an alternate location for the test where the inlined() + // state is complete. if (getLangOpts().CPlusPlusModules && currentModuleIsHeaderUnit() && - FD->getFormalLinkage() == Linkage::ExternalLinkage && !FD->isInlined()) { + FD->getFormalLinkage() == Linkage::ExternalLinkage && + !FD->isInvalidDecl() && BodyKind != FnBodyKind::Delete && + BodyKind != FnBodyKind::Default && !FD->isInlined()) { + assert(FD->isThisDeclarationADefinition()); Diag(FD->getLocation(), diag::err_extern_def_in_header_unit); FD->setInvalidDecl(); } diff --git a/clang/test/CXX/module/module.import/p6.cpp b/clang/test/CXX/module/module.import/p6.cpp index 7d8632786d9e..4360d3e67385 100644 --- a/clang/test/CXX/module/module.import/p6.cpp +++ b/clang/test/CXX/module/module.import/p6.cpp @@ -28,3 +28,11 @@ class A { static const int value = 43; }; +void deleted_fn_ok (void) = delete; + +struct S { + ~S() noexcept(false) = default; +private: + S(S&); +}; +S::S(S&) = default; _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits