Hi Andrea,

I forgot to add the —in-reply-to on my git send-email.

v5 posted here: https://gcc.gnu.org/pipermail/gcc-patches/2026-July/722346.html

Best,
Sammy

> On Jun 30, 2026, at 4:50 PM, Andrea Pinski <[email protected]> 
> wrote:
> 
> On Tue, Jun 30, 2026 at 8:49 AM Sammy Al Hashemi <[email protected]> wrote:
>> 
>> The -Wstrict-aliasing warning was gated on flag_strict_aliasing, so
>> passing -fno-strict-aliasing silenced the warning even when explicitly
>> requested with -Wstrict-aliasing.  The warning analysis is purely
>> type-based and does not depend on the optimization being active, so
>> temporarily enable flag_strict_aliasing around the alias set query
>> calls to get meaningful results for the warning.
>> 
>> gcc/c-family/ChangeLog:
>> 
>>        * c-warn.cc (strict_aliasing_warning): Remove guard on
>>        flag_strict_aliasing.  Temporarily enable it via RAII around
>>        alias set queries so the warning fires independently.
>> 
>> gcc/ChangeLog:
>> 
>>        * doc/invoke.texi (-Wstrict-aliasing): Document that the
>>        warning now works independently of -fstrict-aliasing.
>> 
>> gcc/testsuite/ChangeLog:
>> 
>>        * c-c++-common/Wstrict-aliasing2-with-fno.c: New test.
>>        * c-c++-common/Wstrict-aliasing3-with-fno.c: New test.
>> 
>> Signed-off-by: Sammy Al Hashemi <[email protected]>
>> ---
>> gcc/c-family/c-warn.cc                           |  8 ++++++--
>> gcc/doc/invoke.texi                              | 16 ++++++++++------
>> .../c-c++-common/Wstrict-aliasing2-with-fno.c    | 12 ++++++++++++
>> .../c-c++-common/Wstrict-aliasing3-with-fno.c    | 12 ++++++++++++
>> 4 files changed, 40 insertions(+), 8 deletions(-)
>> create mode 100644 gcc/testsuite/c-c++-common/Wstrict-aliasing2-with-fno.c
>> create mode 100644 gcc/testsuite/c-c++-common/Wstrict-aliasing3-with-fno.c
>> 
>> diff --git a/gcc/c-family/c-warn.cc b/gcc/c-family/c-warn.cc
>> index 1767d2dc090..194b5e3712a 100644
>> --- a/gcc/c-family/c-warn.cc
>> +++ b/gcc/c-family/c-warn.cc
>> @@ -24,6 +24,7 @@ along with GCC; see the file COPYING3.  If not see
>> #include "target.h"
>> #include "function.h"
>> #include "tree.h"
>> +#include "cp/cp-tree.h"
> 
> Instead of including a C++ FE header in the shared C/C++ FE common code.
> Can you move temp_override from cp/cp-tree.h into c-common.h?
> 
> Thanks,
> Andrea
> 
>> #include "c-common.h"
>> #include "memmodel.h"
>> #include "tm_p.h"
>> @@ -701,8 +702,7 @@ strict_aliasing_warning (location_t loc, tree type, tree 
>> expr)
>>   STRIP_NOPS (expr);
>>   tree otype = TREE_TYPE (expr);
>> 
>> -  if (!(flag_strict_aliasing
>> -       && POINTER_TYPE_P (type)
>> +  if (!(POINTER_TYPE_P (type)
>>        && POINTER_TYPE_P (otype)
>>        && !VOID_TYPE_P (TREE_TYPE (type)))
>>       /* If the type we are casting to is a ref-all pointer
>> @@ -710,6 +710,10 @@ strict_aliasing_warning (location_t loc, tree type, 
>> tree expr)
>>       || TYPE_REF_CAN_ALIAS_ALL (type))
>>     return false;
>> 
>> +  /* Temporarily enable strict aliasing so that the alias set query
>> +     functions return meaningful results for the warning.  */
>> +  temp_override<int> save (flag_strict_aliasing, 1);
>> +
>>   if ((warn_strict_aliasing > 1) && TREE_CODE (expr) == ADDR_EXPR
>>       && (DECL_P (TREE_OPERAND (expr, 0))
>>          || handled_component_p (TREE_OPERAND (expr, 0))))
>> diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
>> index 339d1d2c97a..b361290cee4 100644
>> --- a/gcc/doc/invoke.texi
>> +++ b/gcc/doc/invoke.texi
>> @@ -8674,17 +8674,21 @@ the implementation.
>> @opindex Wstrict-aliasing
>> @opindex Wno-strict-aliasing
>> @item -Wstrict-aliasing
>> -This option is only active when @option{-fstrict-aliasing} is active.
>> -It warns about code that might break the strict aliasing rules that the
>> -compiler is using for optimization.  The warning does not catch all
>> +This option warns about code that might break the strict aliasing rules
>> +that the compiler uses for optimization when @option{-fstrict-aliasing}
>> +is active.  This option is independent of @option{-fstrict-aliasing};
>> +it diagnoses code that would violate strict aliasing rules regardless of
>> +whether the optimization is enabled.  The warning does not catch all
>> cases, but does attempt to catch the more common pitfalls.  It is
>> included in @option{-Wall}.
>> It is equivalent to @option{-Wstrict-aliasing=3}.
>> 
>> @item -Wstrict-aliasing=@var{n}
>> -This option is only active when @option{-fstrict-aliasing} is active.
>> -It warns about code that might break the strict aliasing rules that the
>> -compiler is using for optimization.
>> +This option warns about code that might break the strict aliasing rules
>> +that the compiler uses for optimization when @option{-fstrict-aliasing}
>> +is active.  This option is independent of @option{-fstrict-aliasing};
>> +it diagnoses code that would violate strict aliasing rules regardless of
>> +whether the optimization is enabled.
>> Higher levels correspond to higher accuracy (fewer false positives).
>> Higher levels also correspond to more effort, similar to the way @option{-O}
>> works.
>> diff --git a/gcc/testsuite/c-c++-common/Wstrict-aliasing2-with-fno.c 
>> b/gcc/testsuite/c-c++-common/Wstrict-aliasing2-with-fno.c
>> new file mode 100644
>> index 00000000000..c7b223ed91b
>> --- /dev/null
>> +++ b/gcc/testsuite/c-c++-common/Wstrict-aliasing2-with-fno.c
>> @@ -0,0 +1,12 @@
>> +/* Test the usage of option -Wstrict-aliasing.  */
>> +/* Make sure it's enabled even when -fno-strict-aliasing.  */
>> +/* Set -Wstrict-aliasing=2 so it warns on casts */
>> +/* { dg-do compile } */
>> +/* { dg-options "-Wstrict-aliasing=2 -fno-strict-aliasing" } */
>> +
>> +int main(int argc, char *argv[])
>> +{
>> +    int x;
>> +    float *q = (float*) &x; /* { dg-warning "strict-aliasing" } */
>> +    return x;
>> +}
>> diff --git a/gcc/testsuite/c-c++-common/Wstrict-aliasing3-with-fno.c 
>> b/gcc/testsuite/c-c++-common/Wstrict-aliasing3-with-fno.c
>> new file mode 100644
>> index 00000000000..e999b13aec4
>> --- /dev/null
>> +++ b/gcc/testsuite/c-c++-common/Wstrict-aliasing3-with-fno.c
>> @@ -0,0 +1,12 @@
>> +/* Test the usage of option -Wstrict-aliasing.  */
>> +/* Make sure it's enabled even when -fno-strict-aliasing.  */
>> +/* Set -Wstrict-aliasing=3 so that it only warns on dereference */
>> +/* { dg-do compile } */
>> +/* { dg-options "-Wstrict-aliasing=3 -fno-strict-aliasing" } */
>> +
>> +int main(int argc, char *argv[])
>> +{
>> +    int x;
>> +    *(float*) &x = 42; /* { dg-warning "strict-aliasing" } */
>> +    return x;
>> +}
>> --
>> 2.54.0
>> 

Reply via email to