aboutsummaryrefslogtreecommitdiff
path: root/clang/lib/Sema/SemaChecking.cpp
diff options
context:
space:
mode:
authorAkira Hatanaka <ahatanak@gmail.com>2025-04-29 18:37:57 -0700
committerGitHub <noreply@github.com>2025-04-29 18:37:57 -0700
commit6bb4ce0f6ff462b58bacc8dbc47719b7009f9b18 (patch)
treebb1019718f1de286eea7f60dba5ed5994a9b1f24 /clang/lib/Sema/SemaChecking.cpp
parenta01a5b82dc89d427eada7f3b4d2f3e42ef50ae91 (diff)
downloadllvm-6bb4ce0f6ff462b58bacc8dbc47719b7009f9b18.zip
llvm-6bb4ce0f6ff462b58bacc8dbc47719b7009f9b18.tar.gz
llvm-6bb4ce0f6ff462b58bacc8dbc47719b7009f9b18.tar.bz2
Silence spurious -Wnontrivial-memcall warnings in C mode (#137429)
clang currently issues a warning when memset is used on a struct that contains an address-discriminated pointer field, even though this is entirely valid behavior. For example: ``` struct S { int * __ptrauth(1, 1, 100) p; } s; memset(&s, 0, sizeof(struct S)); ``` Only allow the warning to be emitted in C++ mode to silence the warning. rdar://142495870
Diffstat (limited to 'clang/lib/Sema/SemaChecking.cpp')
-rw-r--r--clang/lib/Sema/SemaChecking.cpp10
1 files changed, 5 insertions, 5 deletions
diff --git a/clang/lib/Sema/SemaChecking.cpp b/clang/lib/Sema/SemaChecking.cpp
index 018d121..d2cad8a 100644
--- a/clang/lib/Sema/SemaChecking.cpp
+++ b/clang/lib/Sema/SemaChecking.cpp
@@ -9735,9 +9735,9 @@ void Sema::CheckMemaccessArguments(const CallExpr *Call,
// 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);
+ bool NonTriviallyCopyableCXXRecord =
+ getLangOpts().CPlusPlus && !RT->isIncompleteType() &&
+ !RT->desugar().isTriviallyCopyableType(Context);
if ((BId == Builtin::BImemset || BId == Builtin::BIbzero) &&
RT->getDecl()->isNonTrivialToPrimitiveDefaultInitialize()) {
@@ -9746,7 +9746,7 @@ void Sema::CheckMemaccessArguments(const CallExpr *Call,
<< ArgIdx << FnName << PointeeTy << 0);
SearchNonTrivialToInitializeField::diag(PointeeTy, Dest, *this);
} else if ((BId == Builtin::BImemset || BId == Builtin::BIbzero) &&
- !MayBeTriviallyCopyableCXXRecord && ArgIdx == 0) {
+ NonTriviallyCopyableCXXRecord && ArgIdx == 0) {
// FIXME: Limiting this warning to dest argument until we decide
// whether it's valid for source argument too.
DiagRuntimeBehavior(Dest->getExprLoc(), Dest,
@@ -9759,7 +9759,7 @@ void Sema::CheckMemaccessArguments(const CallExpr *Call,
<< ArgIdx << FnName << PointeeTy << 1);
SearchNonTrivialToCopyField::diag(PointeeTy, Dest, *this);
} else if ((BId == Builtin::BImemcpy || BId == Builtin::BImemmove) &&
- !MayBeTriviallyCopyableCXXRecord && ArgIdx == 0) {
+ NonTriviallyCopyableCXXRecord && ArgIdx == 0) {
// FIXME: Limiting this warning to dest argument until we decide
// whether it's valid for source argument too.
DiagRuntimeBehavior(Dest->getExprLoc(), Dest,