aboutsummaryrefslogtreecommitdiff
path: root/clang/lib/Serialization/ASTWriterDecl.cpp
diff options
context:
space:
mode:
authorChuanqi Xu <yedeng.yd@linux.alibaba.com>2025-03-05 19:02:37 +0800
committerChuanqi Xu <yedeng.yd@linux.alibaba.com>2025-03-05 19:05:49 +0800
commitea15e8b16eacdf2fb3a9715c5fc753b62fdfd516 (patch)
tree0118ab4bea4932e9dd53eef0ad8440e75bc5f338 /clang/lib/Serialization/ASTWriterDecl.cpp
parenta98707e285e08bbf20785bfe54190feab7eb3c91 (diff)
downloadllvm-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.cpp12
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;