On Tue, Jun 9, 2026 at 9:45 PM 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]>
> ---
> Thanks for your feedback, I'm still new to contributing here so I
> appreciate it.
>
> Changes from v2:
> - Added RAII class (auto_override_flag) to save/restore
> flag_strict_aliasing
> - Filled in ChangeLog descriptions
>
> gcc/c-family/c-warn.cc | 28 +++++++++++++++++--
> 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, 60 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..072c16f9b64 100644
> --- a/gcc/c-family/c-warn.cc
> +++ b/gcc/c-family/c-warn.cc
> @@ -685,6 +685,27 @@ warn_if_unused_value (const_tree exp, location_t locus,
> bool quiet)
> }
> }
>
> +/* RAII guard to temporarily override an integer flag, restoring its
> + original value when the guard goes out of scope. */
> +class auto_override_flag
> +{
> +public:
> + auto_override_flag (int &flag, int new_value)
> + : m_flag (flag), m_saved (flag)
> + {
> + m_flag = new_value;
> + }
> +
> + ~auto_override_flag ()
> + {
> + m_flag = m_saved;
> + }
> +
> +private:
> + int &m_flag;
> + int m_saved;
> +};
Somehow I think we already have such class, in the C++ frontend?
> +
> /* Print a warning about casts that might indicate violation of strict
> aliasing rules if -Wstrict-aliasing is used and strict aliasing
> mode is in effect. LOC is the location of the expression being
> @@ -701,8 +722,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 +730,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. */
> + auto_override_flag 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
>