aboutsummaryrefslogtreecommitdiff
path: root/clang/lib/Sema/SemaChecking.cpp
diff options
context:
space:
mode:
authorserge-sans-paille <sguelton@mozilla.com>2024-10-30 07:32:05 +0000
committerGitHub <noreply@github.com>2024-10-30 07:32:05 +0000
commitdc56a86b96d77a93f761995d50f7b2f112856311 (patch)
tree9a54288b0454ee9704c3ba483090a8eaf6f8a585 /clang/lib/Sema/SemaChecking.cpp
parent5df84a75351d0e9c3e20d50ac1047c937e3b8e88 (diff)
downloadllvm-dc56a86b96d77a93f761995d50f7b2f112856311.zip
llvm-dc56a86b96d77a93f761995d50f7b2f112856311.tar.gz
llvm-dc56a86b96d77a93f761995d50f7b2f112856311.tar.bz2
[clang] Fix 71315698c9 in presence of incomplete types (#114095)
Incomplete types are not considered trivially copyable by clang but we don't want to warn about invalid argument for memcpy / memset in that case because we cannot prove they are not Trivially Copyable.
Diffstat (limited to 'clang/lib/Sema/SemaChecking.cpp')
-rw-r--r--clang/lib/Sema/SemaChecking.cpp11
1 files changed, 8 insertions, 3 deletions
diff --git a/clang/lib/Sema/SemaChecking.cpp b/clang/lib/Sema/SemaChecking.cpp
index 3308b89..dae271c 100644
--- a/clang/lib/Sema/SemaChecking.cpp
+++ b/clang/lib/Sema/SemaChecking.cpp
@@ -8900,7 +8900,12 @@ void Sema::CheckMemaccessArguments(const CallExpr *Call,
<< Call->getCallee()->getSourceRange());
else if (const auto *RT = PointeeTy->getAs<RecordType>()) {
- bool IsTriviallyCopyableCXXRecord =
+ // FIXME: Do not consider incomplete types even though they may be
+ // completed later. GCC does not diagnose such code, but we may want to
+ // consider diagnosing it in the future, perhaps under a different, but
+ // related, diagnostic group.
+ bool MayBeTriviallyCopyableCXXRecord =
+ RT->isIncompleteType() ||
RT->desugar().isTriviallyCopyableType(Context);
if ((BId == Builtin::BImemset || BId == Builtin::BIbzero) &&
@@ -8910,7 +8915,7 @@ void Sema::CheckMemaccessArguments(const CallExpr *Call,
<< ArgIdx << FnName << PointeeTy << 0);
SearchNonTrivialToInitializeField::diag(PointeeTy, Dest, *this);
} else if ((BId == Builtin::BImemset || BId == Builtin::BIbzero) &&
- !IsTriviallyCopyableCXXRecord && ArgIdx == 0) {
+ !MayBeTriviallyCopyableCXXRecord && ArgIdx == 0) {
// FIXME: Limiting this warning to dest argument until we decide
// whether it's valid for source argument too.
DiagRuntimeBehavior(Dest->getExprLoc(), Dest,
@@ -8923,7 +8928,7 @@ void Sema::CheckMemaccessArguments(const CallExpr *Call,
<< ArgIdx << FnName << PointeeTy << 1);
SearchNonTrivialToCopyField::diag(PointeeTy, Dest, *this);
} else if ((BId == Builtin::BImemcpy || BId == Builtin::BImemmove) &&
- !IsTriviallyCopyableCXXRecord && ArgIdx == 0) {
+ !MayBeTriviallyCopyableCXXRecord && ArgIdx == 0) {
// FIXME: Limiting this warning to dest argument until we decide
// whether it's valid for source argument too.
DiagRuntimeBehavior(Dest->getExprLoc(), Dest,