diff options
author | Chuanqi Xu <yedeng.yd@linux.alibaba.com> | 2025-03-05 19:02:37 +0800 |
---|---|---|
committer | Chuanqi Xu <yedeng.yd@linux.alibaba.com> | 2025-03-05 19:05:49 +0800 |
commit | ea15e8b16eacdf2fb3a9715c5fc753b62fdfd516 (patch) | |
tree | 0118ab4bea4932e9dd53eef0ad8440e75bc5f338 /clang/lib/Serialization/ASTWriterDecl.cpp | |
parent | a98707e285e08bbf20785bfe54190feab7eb3c91 (diff) | |
download | llvm-ea15e8b16eacdf2fb3a9715c5fc753b62fdfd516.zip llvm-ea15e8b16eacdf2fb3a9715c5fc753b62fdfd516.tar.gz llvm-ea15e8b16eacdf2fb3a9715c5fc753b62fdfd516.tar.bz2 |
[C++20] [Modules] Avoid use-but-not-defined error
See the attached test for example.
Diffstat (limited to 'clang/lib/Serialization/ASTWriterDecl.cpp')
-rw-r--r-- | clang/lib/Serialization/ASTWriterDecl.cpp | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/clang/lib/Serialization/ASTWriterDecl.cpp b/clang/lib/Serialization/ASTWriterDecl.cpp index a181000..88dd212 100644 --- a/clang/lib/Serialization/ASTWriterDecl.cpp +++ b/clang/lib/Serialization/ASTWriterDecl.cpp @@ -330,6 +330,12 @@ namespace clang { } bool clang::CanElideDeclDef(const Decl *D) { + bool isExternalWithNoLinkageType = false; + if (auto *VD = dyn_cast<ValueDecl>(D)) + if (VD->hasExternalFormalLinkage() && + !isExternalFormalLinkage(VD->getType()->getLinkage())) + isExternalWithNoLinkageType = true; + if (auto *FD = dyn_cast<FunctionDecl>(D)) { if (FD->isInlined() || FD->isConstexpr()) return false; @@ -339,6 +345,9 @@ bool clang::CanElideDeclDef(const Decl *D) { if (FD->getTemplateSpecializationKind() == TSK_ImplicitInstantiation) return false; + + if (isExternalWithNoLinkageType && !FD->isExternC()) + return false; } if (auto *VD = dyn_cast<VarDecl>(D)) { @@ -352,6 +361,9 @@ bool clang::CanElideDeclDef(const Decl *D) { if (VD->getTemplateSpecializationKind() == TSK_ImplicitInstantiation) return false; + + if (isExternalWithNoLinkageType && !VD->isExternC()) + return false; } return true; |