public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc r9-8897] c++: Avoid strict_aliasing_warning on dependent types or expressions [PR94951]
@ 2020-09-16 19:22 Jakub Jelinek
  0 siblings, 0 replies; only message in thread
From: Jakub Jelinek @ 2020-09-16 19:22 UTC (permalink / raw)
  To: gcc-cvs

https://gcc.gnu.org/g:eca1dbea010ba4c18ccec90bacbad5d8ec72c09f

commit r9-8897-geca1dbea010ba4c18ccec90bacbad5d8ec72c09f
Author: Jakub Jelinek <jakub@redhat.com>
Date:   Wed May 6 23:38:13 2020 +0200

    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.
    
    (cherry picked from commit d82414ebcf7716ea24688510594a2c464a105908)

Diff:
---
 gcc/cp/typeck.c                                    | 28 +++++++++++++++++-----
 .../g++.dg/warn/Wstrict-aliasing-bogus-tmpl.C      | 12 ++++++++++
 2 files changed, 34 insertions(+), 6 deletions(-)

diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c
index 2169f8c4efd..ab703a3ff07 100644
--- a/gcc/cp/typeck.c
+++ b/gcc/cp/typeck.c
@@ -3238,6 +3238,22 @@ build_x_indirect_ref (location_t loc, tree expr, ref_operator errorstring,
     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
    constructs.  If DO_FOLD is true, fold away INDIRECT_REF of ADDR_EXPR.  */
 
@@ -3280,10 +3296,10 @@ cp_build_indirect_ref_1 (tree ptr, ref_operator errorstring,
 	  /* If a warning is issued, mark it to avoid duplicates from
 	     the backend.  This only needs to be done at
 	     warn_strict_aliasing > 2.  */
-	  if (warn_strict_aliasing > 2)
-	    if (strict_aliasing_warning (EXPR_LOCATION (ptr),
-					 type, TREE_OPERAND (ptr, 0)))
-	      TREE_NO_WARNING (ptr) = 1;
+	  if (warn_strict_aliasing > 2
+	      && cp_strict_aliasing_warning (EXPR_LOCATION (ptr),
+					     type, TREE_OPERAND (ptr, 0)))
+	    TREE_NO_WARNING (ptr) = 1;
 	}
 
       if (VOID_TYPE_P (t))
@@ -7535,7 +7551,7 @@ build_reinterpret_cast_1 (tree type, tree expr, bool c_cast_p,
       expr = cp_build_addr_expr (expr, complain);
 
       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)
 	expr = build_reinterpret_cast_1
@@ -7648,7 +7664,7 @@ build_reinterpret_cast_1 (tree type, tree expr, bool c_cast_p,
 
       if (warn_strict_aliasing <= 2)
 	/* 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);
     }
diff --git a/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-bogus-tmpl.C b/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-bogus-tmpl.C
new file mode 100644
index 00000000000..d0375042e42
--- /dev/null
+++ b/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-bogus-tmpl.C
@@ -0,0 +1,12 @@
+// 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 ();


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2020-09-16 19:22 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-09-16 19:22 [gcc r9-8897] c++: Avoid strict_aliasing_warning on dependent types or expressions [PR94951] Jakub Jelinek

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).