Commit 0444aa9c by Nathan Sidwell Committed by Nathan Sidwell

[PR c/84293] Unexpected strict-alias warning

https://gcc.gnu.org/ml/gcc-patches/2018-02/msg00510.html
	PR c/84293
	gcc/c/
	* c-typeck.c (build_indirect_ref, build_c_cast): Pass expr location
	to strict_aliasing_warning.

	gcc/c-family/
	* c-common.h (strict_aliasing_warning): Drop OTYPE arg, insert LOC
	arg.
	* c-warn.c (strict_aliasing_warning): Drop OTYPE arg, require LOC
	arg.  Adjust.

	gcc/cp/
	* typeck.c (cp_build_indirect_ref_1, build_reinterpret_cast_1):
	Pass expr location to strict_aliasing_warning.

	gcc/testsuite/
	* c-c++-common/pr84293.h: New.
	* c-c++-common/pr84293.c: New.

From-SVN: r257539
parent dd2799cc
2018-02-09 Nathan Sidwell <nathan@acm.org>
PR c/84293
* c-common.h (strict_aliasing_warning): Drop OTYPE arg, insert LOC
arg.
* c-warn.c (strict_aliasing_warning): Drop OTYPE arg, require LOC
arg. Adjust.
2018-02-09 Martin Sebor <msebor@redhat.com> 2018-02-09 Martin Sebor <msebor@redhat.com>
PR lto/84212 PR lto/84212
......
...@@ -1260,7 +1260,7 @@ extern void warn_tautological_cmp (location_t, enum tree_code, tree, tree); ...@@ -1260,7 +1260,7 @@ extern void warn_tautological_cmp (location_t, enum tree_code, tree, tree);
extern void warn_logical_not_parentheses (location_t, enum tree_code, tree, extern void warn_logical_not_parentheses (location_t, enum tree_code, tree,
tree); tree);
extern bool warn_if_unused_value (const_tree, location_t); extern bool warn_if_unused_value (const_tree, location_t);
extern bool strict_aliasing_warning (tree, tree, tree); extern bool strict_aliasing_warning (location_t, tree, tree);
extern void sizeof_pointer_memaccess_warning (location_t *, tree, extern void sizeof_pointer_memaccess_warning (location_t *, tree,
vec<tree, va_gc> *, tree *, vec<tree, va_gc> *, tree *,
bool (*) (tree, tree)); bool (*) (tree, tree));
......
...@@ -599,17 +599,21 @@ warn_if_unused_value (const_tree exp, location_t locus) ...@@ -599,17 +599,21 @@ warn_if_unused_value (const_tree exp, location_t locus)
} }
} }
/* Print a warning about casts that might indicate violation /* Print a warning about casts that might indicate violation of strict
of strict aliasing rules if -Wstrict-aliasing is used and aliasing rules if -Wstrict-aliasing is used and strict aliasing
strict aliasing mode is in effect. OTYPE is the original mode is in effect. LOC is the location of the expression being
TREE_TYPE of EXPR, and TYPE the type we're casting to. */ cast, EXPR might be from inside it. TYPE is the type we're casting
to. */
bool bool
strict_aliasing_warning (tree otype, tree type, tree expr) strict_aliasing_warning (location_t loc, tree type, tree expr)
{ {
if (loc == UNKNOWN_LOCATION)
loc = input_location;
/* Strip pointer conversion chains and get to the correct original type. */ /* Strip pointer conversion chains and get to the correct original type. */
STRIP_NOPS (expr); STRIP_NOPS (expr);
otype = TREE_TYPE (expr); tree otype = TREE_TYPE (expr);
if (!(flag_strict_aliasing if (!(flag_strict_aliasing
&& POINTER_TYPE_P (type) && POINTER_TYPE_P (type)
...@@ -628,7 +632,8 @@ strict_aliasing_warning (tree otype, tree type, tree expr) ...@@ -628,7 +632,8 @@ strict_aliasing_warning (tree otype, tree type, tree expr)
if the cast breaks type based aliasing. */ if the cast breaks type based aliasing. */
if (!COMPLETE_TYPE_P (TREE_TYPE (type)) && warn_strict_aliasing == 2) if (!COMPLETE_TYPE_P (TREE_TYPE (type)) && warn_strict_aliasing == 2)
{ {
warning (OPT_Wstrict_aliasing, "type-punning to incomplete type " warning_at (loc, OPT_Wstrict_aliasing,
"type-punning to incomplete type "
"might break strict-aliasing rules"); "might break strict-aliasing rules");
return true; return true;
} }
...@@ -645,14 +650,16 @@ strict_aliasing_warning (tree otype, tree type, tree expr) ...@@ -645,14 +650,16 @@ strict_aliasing_warning (tree otype, tree type, tree expr)
&& !alias_set_subset_of (set2, set1) && !alias_set_subset_of (set2, set1)
&& !alias_sets_conflict_p (set1, set2)) && !alias_sets_conflict_p (set1, set2))
{ {
warning (OPT_Wstrict_aliasing, "dereferencing type-punned " warning_at (loc, OPT_Wstrict_aliasing,
"dereferencing type-punned "
"pointer will break strict-aliasing rules"); "pointer will break strict-aliasing rules");
return true; return true;
} }
else if (warn_strict_aliasing == 2 else if (warn_strict_aliasing == 2
&& !alias_sets_must_conflict_p (set1, set2)) && !alias_sets_must_conflict_p (set1, set2))
{ {
warning (OPT_Wstrict_aliasing, "dereferencing type-punned " warning_at (loc, OPT_Wstrict_aliasing,
"dereferencing type-punned "
"pointer might break strict-aliasing rules"); "pointer might break strict-aliasing rules");
return true; return true;
} }
...@@ -669,7 +676,8 @@ strict_aliasing_warning (tree otype, tree type, tree expr) ...@@ -669,7 +676,8 @@ strict_aliasing_warning (tree otype, tree type, tree expr)
if (!COMPLETE_TYPE_P (type) if (!COMPLETE_TYPE_P (type)
|| !alias_sets_must_conflict_p (set1, set2)) || !alias_sets_must_conflict_p (set1, set2))
{ {
warning (OPT_Wstrict_aliasing, "dereferencing type-punned " warning_at (loc, OPT_Wstrict_aliasing,
"dereferencing type-punned "
"pointer might break strict-aliasing rules"); "pointer might break strict-aliasing rules");
return true; return true;
} }
......
2018-02-09 Nathan Sidwell <nathan@acm.org>
PR c/84293
* c-typeck.c (build_indirect_ref, build_c_cast): Pass expr location
to strict_aliasing_warning.
2018-02-02 Paolo Carlini <paolo.carlini@oracle.com> 2018-02-02 Paolo Carlini <paolo.carlini@oracle.com>
* c-typeck.c (really_start_incremental_init, push_init_level, * c-typeck.c (really_start_incremental_init, push_init_level,
......
...@@ -2524,7 +2524,7 @@ build_indirect_ref (location_t loc, tree ptr, ref_operator errstring) ...@@ -2524,7 +2524,7 @@ build_indirect_ref (location_t loc, tree ptr, ref_operator errstring)
the backend. This only needs to be done at the backend. This only needs to be done at
warn_strict_aliasing > 2. */ warn_strict_aliasing > 2. */
if (warn_strict_aliasing > 2) if (warn_strict_aliasing > 2)
if (strict_aliasing_warning (TREE_TYPE (TREE_OPERAND (pointer, 0)), if (strict_aliasing_warning (EXPR_LOCATION (pointer),
type, TREE_OPERAND (pointer, 0))) type, TREE_OPERAND (pointer, 0)))
TREE_NO_WARNING (pointer) = 1; TREE_NO_WARNING (pointer) = 1;
} }
...@@ -5696,7 +5696,7 @@ build_c_cast (location_t loc, tree type, tree expr) ...@@ -5696,7 +5696,7 @@ build_c_cast (location_t loc, tree type, tree expr)
"of different size"); "of different size");
if (warn_strict_aliasing <= 2) if (warn_strict_aliasing <= 2)
strict_aliasing_warning (otype, type, expr); strict_aliasing_warning (EXPR_LOCATION (value), type, expr);
/* If pedantic, warn for conversions between function and object /* If pedantic, warn for conversions between function and object
pointer types, except for converting a null pointer constant pointer types, except for converting a null pointer constant
......
2018-02-09 Nathan Sidwell <nathan@acm.org>
PR c/84293
* typeck.c (cp_build_indirect_ref_1, build_reinterpret_cast_1):
Pass expr location to strict_aliasing_warning.
2018-02-09 Jason Merrill <jason@redhat.com> 2018-02-09 Jason Merrill <jason@redhat.com>
PR c++/84296 - ICE with qualified-id in template. PR c++/84296 - ICE with qualified-id in template.
......
...@@ -3136,7 +3136,7 @@ cp_build_indirect_ref_1 (tree ptr, ref_operator errorstring, ...@@ -3136,7 +3136,7 @@ cp_build_indirect_ref_1 (tree ptr, ref_operator errorstring,
the backend. This only needs to be done at the backend. This only needs to be done at
warn_strict_aliasing > 2. */ warn_strict_aliasing > 2. */
if (warn_strict_aliasing > 2) if (warn_strict_aliasing > 2)
if (strict_aliasing_warning (TREE_TYPE (TREE_OPERAND (ptr, 0)), if (strict_aliasing_warning (EXPR_LOCATION (ptr),
type, TREE_OPERAND (ptr, 0))) type, TREE_OPERAND (ptr, 0)))
TREE_NO_WARNING (ptr) = 1; TREE_NO_WARNING (ptr) = 1;
} }
...@@ -7334,7 +7334,7 @@ build_reinterpret_cast_1 (tree type, tree expr, bool c_cast_p, ...@@ -7334,7 +7334,7 @@ build_reinterpret_cast_1 (tree type, tree expr, bool c_cast_p,
expr = cp_build_addr_expr (expr, complain); expr = cp_build_addr_expr (expr, complain);
if (warn_strict_aliasing > 2) if (warn_strict_aliasing > 2)
strict_aliasing_warning (TREE_TYPE (expr), type, expr); strict_aliasing_warning (EXPR_LOCATION (expr), type, expr);
if (expr != error_mark_node) if (expr != error_mark_node)
expr = build_reinterpret_cast_1 expr = build_reinterpret_cast_1
...@@ -7428,8 +7428,6 @@ build_reinterpret_cast_1 (tree type, tree expr, bool c_cast_p, ...@@ -7428,8 +7428,6 @@ build_reinterpret_cast_1 (tree type, tree expr, bool c_cast_p,
else if ((TYPE_PTRDATAMEM_P (type) && TYPE_PTRDATAMEM_P (intype)) else if ((TYPE_PTRDATAMEM_P (type) && TYPE_PTRDATAMEM_P (intype))
|| (TYPE_PTROBV_P (type) && TYPE_PTROBV_P (intype))) || (TYPE_PTROBV_P (type) && TYPE_PTROBV_P (intype)))
{ {
tree sexpr = expr;
if (!c_cast_p if (!c_cast_p
&& check_for_casting_away_constness (intype, type, && check_for_casting_away_constness (intype, type,
REINTERPRET_CAST_EXPR, REINTERPRET_CAST_EXPR,
...@@ -7447,11 +7445,9 @@ build_reinterpret_cast_1 (tree type, tree expr, bool c_cast_p, ...@@ -7447,11 +7445,9 @@ build_reinterpret_cast_1 (tree type, tree expr, bool c_cast_p,
warning (OPT_Wcast_align, "cast from %qH to %qI " warning (OPT_Wcast_align, "cast from %qH to %qI "
"increases required alignment of target type", intype, type); "increases required alignment of target type", intype, type);
/* We need to strip nops here, because the front end likes to
create (int *)&a for array-to-pointer decay, instead of &a[0]. */
STRIP_NOPS (sexpr);
if (warn_strict_aliasing <= 2) if (warn_strict_aliasing <= 2)
strict_aliasing_warning (intype, type, sexpr); /* strict_aliasing_warning STRIP_NOPs its expr. */
strict_aliasing_warning (EXPR_LOCATION (expr), type, expr);
return build_nop (type, expr); return build_nop (type, expr);
} }
......
2018-02-09 Nathan Sidwell <nathan@acm.org>
PR c/84293
* c-c++-common/pr84293.h: New.
* c-c++-common/pr84293.c: New.
2018-02-09 Vladimir Makarov <vmakarov@redhat.com> 2018-02-09 Vladimir Makarov <vmakarov@redhat.com>
PR rtl-optimization/57193 PR rtl-optimization/57193
......
/* PR c/84293 unexpected warning from system header. */
#include "./pr84293.h"
struct typeobject thing;
#pragma GCC diagnostic warning "-Wstrict-aliasing"
void __attribute__ ((optimize (2))) init ()
{
INCREF_TDEF (&thing);
INCREF_STAG (&thing);
}
/* PR c/84293 unexpected warning from system header expansion. */
#pragma GCC system_header
struct typeobject { unsigned refs; };
typedef struct object { unsigned refs; } Object;
#define INCREF_TDEF(op) (((Object*)(op))->refs++)
#define INCREF_STAG(op) (((struct object*)(op))->refs++)
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment