[clang] 199dfb4 - Silence a false positive about an unevaluated expr w/side effects

Aaron Ballman via cfe-commits cfe-commits at lists.llvm.org
Thu May 5 09:12:41 PDT 2022


Author: Aaron Ballman
Date: 2022-05-05T12:12:30-04:00
New Revision: 199dfb4d0cca0aaa217e79bd2371f96f6336bbc5

URL: https://github.com/llvm/llvm-project/commit/199dfb4d0cca0aaa217e79bd2371f96f6336bbc5
DIFF: https://github.com/llvm/llvm-project/commit/199dfb4d0cca0aaa217e79bd2371f96f6336bbc5.diff

LOG: Silence a false positive about an unevaluated expr w/side effects

If the operand to `sizeof` is an expression of VLA type, the operand is
still evaluated, so we should not issue a diagnostic about ignoring the
side effects in this case, as they're not actually ignored.

Fixes #48010

Added: 
    

Modified: 
    clang/docs/ReleaseNotes.rst
    clang/lib/Sema/SemaExpr.cpp
    clang/test/Sema/warn-unused-value.c

Removed: 
    


################################################################################
diff  --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 4ddf1c6eb5382..f5e9cd941e091 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -139,6 +139,9 @@ Bug Fixes
 - Fixed a crash when the ``__bf16`` type is used such that its size or
   alignment is calculated on a target which does not support that type. This
   fixes `Issue 50171 <https://github.com/llvm/llvm-project/issues/50171>`_.
+- Fixed a false positive diagnostic about an unevaluated expression having no
+  side effects when the expression is of VLA type and is an operand of the
+  ``sizeof`` operator. Fixes `Issue 48010 <https://github.com/llvm/llvm-project/issues/48010>`_.
 
 Improvements to Clang's diagnostics
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

diff  --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp
index 058967b656bc9..6b86c02c60913 100644
--- a/clang/lib/Sema/SemaExpr.cpp
+++ b/clang/lib/Sema/SemaExpr.cpp
@@ -4245,6 +4245,7 @@ bool Sema::CheckUnaryExprOrTypeTraitOperand(Expr *E,
   // FIXME: Should we consider instantiation-dependent operands to 'alignof'?
   if (IsUnevaluatedOperand && !inTemplateInstantiation() &&
       !E->isInstantiationDependent() &&
+      !E->getType()->isVariableArrayType() &&
       E->HasSideEffects(Context, false))
     Diag(E->getExprLoc(), diag::warn_side_effects_unevaluated_context);
 

diff  --git a/clang/test/Sema/warn-unused-value.c b/clang/test/Sema/warn-unused-value.c
index cc54ad61f0b93..9e353ef1d14c4 100644
--- a/clang/test/Sema/warn-unused-value.c
+++ b/clang/test/Sema/warn-unused-value.c
@@ -99,11 +99,15 @@ void unevaluated_operands(void) {
   (void)_Generic(val++, default : 0); // expected-warning {{expression with side effects has no effect in an unevaluated context}}
   (void)_Alignof(val++);  // expected-warning {{expression with side effects has no effect in an unevaluated context}} expected-warning {{'_Alignof' applied to an expression is a GNU extension}}
 
-  // VLAs can have side effects so long as it's part of the type and not
-  // an expression.
+  // VLAs can have side effects so long as it's part of the type and not an
+  // expression, except for sizeof() where it can also have a side effect if
+  // the operand is of VLA type.
   (void)sizeof(int[++val]); // Ok
   (void)_Alignof(int[++val]); // Ok
 
+  int GH48010[val];
+  (void)sizeof(*(val = 1, &GH48010)); // Ok
+
   // Side effects as part of macro expansion are ok.
   GenTest(val++);
 }


        


More information about the cfe-commits mailing list