Commit d82414eb by Jakub Jelinek

c++: Avoid strict_aliasing_warning on dependent types or expressions [PR94951]

The following testcase gets a bogus warning during build_base_path,
when cp_build_indirect_ref* calls strict_aliasing_warning with a dependent
expression.  IMHO calling get_alias_set etc. on dependent types feels wrong
to me, we should just defer the warnings in those cases until instantiation
and only handle the cases where neither type nor expr are dependent.

2020-05-06  Jakub Jelinek  <jakub@redhat.com>

	PR c++/94951
	* typeck.c (cp_strict_aliasing_warning): New function.
	(cp_build_indirect_ref_1, build_reinterpret_cast_1): Use
	it instead of strict_aliasing_warning.

	* g++.dg/warn/Wstrict-aliasing-bogus-tmpl.C: New test.
parent 3d4c7e05
2020-05-06 Jakub Jelinek <jakub@redhat.com> 2020-05-06 Jakub Jelinek <jakub@redhat.com>
PR c++/94951
* typeck.c (cp_strict_aliasing_warning): New function.
(cp_build_indirect_ref_1, build_reinterpret_cast_1): Use
it instead of strict_aliasing_warning.
2020-05-06 Jakub Jelinek <jakub@redhat.com>
PR c++/94907 PR c++/94907
* method.c (defaulted_late_check): Don't call synthesize_method * method.c (defaulted_late_check): Don't call synthesize_method
on constexpr sfk_comparison if it has been called on it already. on constexpr sfk_comparison if it has been called on it already.
......
...@@ -3318,6 +3318,22 @@ build_x_indirect_ref (location_t loc, tree expr, ref_operator errorstring, ...@@ -3318,6 +3318,22 @@ build_x_indirect_ref (location_t loc, tree expr, ref_operator errorstring,
return rval; return rval;
} }
/* Like c-family strict_aliasing_warning, but don't warn for dependent
types or expressions. */
static bool
cp_strict_aliasing_warning (location_t loc, tree type, tree expr)
{
if (processing_template_decl)
{
tree e = expr;
STRIP_NOPS (e);
if (dependent_type_p (type) || type_dependent_expression_p (e))
return false;
}
return strict_aliasing_warning (loc, type, expr);
}
/* The implementation of the above, and of indirection implied by other /* The implementation of the above, and of indirection implied by other
constructs. If DO_FOLD is true, fold away INDIRECT_REF of ADDR_EXPR. */ constructs. If DO_FOLD is true, fold away INDIRECT_REF of ADDR_EXPR. */
...@@ -3360,10 +3376,10 @@ cp_build_indirect_ref_1 (location_t loc, tree ptr, ref_operator errorstring, ...@@ -3360,10 +3376,10 @@ cp_build_indirect_ref_1 (location_t loc, tree ptr, ref_operator errorstring,
/* If a warning is issued, mark it to avoid duplicates from /* If a warning is issued, mark it to avoid duplicates from
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 (EXPR_LOCATION (ptr), && cp_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;
} }
if (VOID_TYPE_P (t)) if (VOID_TYPE_P (t))
...@@ -7777,7 +7793,7 @@ build_reinterpret_cast_1 (location_t loc, tree type, tree expr, ...@@ -7777,7 +7793,7 @@ build_reinterpret_cast_1 (location_t loc, tree type, tree expr,
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 (EXPR_LOCATION (expr), type, expr); cp_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
...@@ -7891,7 +7907,7 @@ build_reinterpret_cast_1 (location_t loc, tree type, tree expr, ...@@ -7891,7 +7907,7 @@ build_reinterpret_cast_1 (location_t loc, tree type, tree expr,
if (warn_strict_aliasing <= 2) if (warn_strict_aliasing <= 2)
/* strict_aliasing_warning STRIP_NOPs its expr. */ /* strict_aliasing_warning STRIP_NOPs its expr. */
strict_aliasing_warning (EXPR_LOCATION (expr), type, expr); cp_strict_aliasing_warning (EXPR_LOCATION (expr), type, expr);
return build_nop_reinterpret (type, expr); return build_nop_reinterpret (type, expr);
} }
......
2020-05-06 Jakub Jelinek <jakub@redhat.com> 2020-05-06 Jakub Jelinek <jakub@redhat.com>
PR c++/94951
* g++.dg/warn/Wstrict-aliasing-bogus-tmpl.C: New test.
2020-05-06 Jakub Jelinek <jakub@redhat.com>
PR c++/94907 PR c++/94907
* g++.dg/cpp2a/spaceship-synth8.C: New test. * g++.dg/cpp2a/spaceship-synth8.C: New test.
......
// PR c++/94951
// { dg-do compile }
// { dg-options "-O2 -Wall" }
struct A { int a; };
template <int N>
struct B : public A
{
static B<N> foo () { B<N> t; t.a = 4; return t; } // { dg-bogus "dereferencing type-punned pointer will break strict-aliasing rules" }
};
B<0> b = B<0>::foo ();
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