[Clang] Don't warn if deferencing void pointers in unevaluated context

After https://reviews.llvm.org/D134461, Clang will diagnose a warning if
trying to deference void pointers in C mode. However, this causes a lot
of noises when compiling a 5.19.11 Linux kernel.

This patch reduces the warning by marking deferencing void pointers in
unevaluated context OK, like `sizeof(*void_ptr)`, `typeof(*void_ptr)`
and etc.

Fixes https://github.com/ClangBuiltLinux/linux/issues/1720

Signed-off-by: Jun Zhang <jun@junz.org>

Differential Revision: https://reviews.llvm.org/D134702
This commit is contained in:
Jun Zhang 2022-09-28 12:30:02 +08:00
parent eb53416d0f
commit 89e56e732d
No known key found for this signature in database
GPG Key ID: E19904830B621534
3 changed files with 10 additions and 2 deletions

View File

@ -14536,7 +14536,7 @@ static QualType CheckIndirectionOperand(Sema &S, Expr *Op, ExprValueKind &VK,
// [...] the expression to which [the unary * operator] is applied shall
// be a pointer to an object type, or a pointer to a function type
LangOptions LO = S.getLangOpts();
if (LO.CPlusPlus || !(LO.C99 && IsAfterAmp))
if (LO.CPlusPlus || !(LO.C99 && (IsAfterAmp || S.isUnevaluatedContext())))
S.Diag(OpLoc, diag::ext_typecheck_indirection_through_void_pointer)
<< LO.CPlusPlus << OpTy << Op->getSourceRange();
}

View File

@ -133,7 +133,7 @@ void handle_sizeof_void(unsigned flag) {
void* q;
if (!flag) {
if (sizeof(*q) == 1) // expected-warning {{ISO C does not allow indirection on operand of type 'void *'}}
if (sizeof(*q) == 1)
return;
// Infeasibe.
*p = 1; // no-warning

View File

@ -0,0 +1,8 @@
// RUN: %clang_cc1 -fsyntax-only -Wno-unused-value -verify %s
// expected-no-diagnostics
void foo(void *vp) {
sizeof(*vp);
sizeof(*(vp));
void inner(typeof(*vp));
}