]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
c++: Avoid strict_aliasing_warning on dependent types or expressions [PR94951]
authorJakub Jelinek <jakub@redhat.com>
Wed, 6 May 2020 21:38:13 +0000 (23:38 +0200)
committerJakub Jelinek <jakub@redhat.com>
Thu, 7 May 2020 13:20:27 +0000 (15:20 +0200)
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.

gcc/cp/ChangeLog
gcc/cp/typeck.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/warn/Wstrict-aliasing-bogus-tmpl.C [new file with mode: 0644]

index f32ef9239c7b6793aa83da6c7d316fb3c1162e4d..c374c2b7644d7f37c87ccbab4f0df6e4309875f0 100644 (file)
@@ -1,3 +1,10 @@
+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
index 8e3188a415d91a0d2ea1a8614bd32029adc2bd28..13d9602c32b224014da5ca2c7c28d4322a92f740 100644 (file)
@@ -3318,6 +3318,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.  */
 
@@ -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
             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))
@@ -7777,7 +7793,7 @@ build_reinterpret_cast_1 (location_t loc, tree type, tree expr,
       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
@@ -7891,7 +7907,7 @@ build_reinterpret_cast_1 (location_t loc, tree type, tree expr,
 
       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);
     }
index 28faf7a9b563a561efb5413cb2f53dcb1c9e9d46..7be686f68c63dc14204ae93bbf78f77a1655035f 100644 (file)
@@ -1,3 +1,8 @@
+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
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 (file)
index 0000000..d037504
--- /dev/null
@@ -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 ();