diff options
author | Akira Hatanaka <ahatanak@gmail.com> | 2025-04-29 18:37:57 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-04-29 18:37:57 -0700 |
commit | 6bb4ce0f6ff462b58bacc8dbc47719b7009f9b18 (patch) | |
tree | bb1019718f1de286eea7f60dba5ed5994a9b1f24 /clang/lib/Sema/SemaChecking.cpp | |
parent | a01a5b82dc89d427eada7f3b4d2f3e42ef50ae91 (diff) | |
download | llvm-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.cpp | 10 |
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, |