middle-end/94216 fix another build_fold_addr_expr use
authorRichard Biener <rguenther@suse.de>
Thu, 19 Mar 2020 09:15:52 +0000 (10:15 +0100)
committerRichard Biener <rguenther@suse.de>
Thu, 19 Mar 2020 09:18:01 +0000 (10:18 +0100)
2020-03-19  Richard Biener  <rguenther@suse.de>

PR middle-end/94216
* fold-const.c (fold_binary_loc): Avoid using
build_fold_addr_expr when we really want an ADDR_EXPR.

* g++.dg/torture/pr94216.C: New testcase.

gcc/ChangeLog
gcc/fold-const.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/torture/pr94216.C [new file with mode: 0644]

index 66202f0253f5ea44b14836ff9e7c8e7e25a3672a..f015a55a87000043d9ab8dd8dbb746829c05b7f5 100644 (file)
@@ -1,3 +1,9 @@
+2020-03-19  Richard Biener  <rguenther@suse.de>
+
+       PR middle-end/94216
+       * fold-const.c (fold_binary_loc): Avoid using
+       build_fold_addr_expr when we really want an ADDR_EXPR.
+
 2020-03-18  Segher Boessenkool  <segher@kernel.crashing.org>
 
        * config/rs6000/constraints.md (wd, wf, wi, ws, ww): New undocumented
index 3ab1a9adcdff9df1937991e4f3db5cbc60559e25..92679142f0472a46191e85b6fafed1c755a1b412 100644 (file)
@@ -10284,7 +10284,7 @@ fold_binary_loc (location_t loc, enum tree_code code, tree type,
          if (!base)
            return NULL_TREE;
          return fold_build2 (MEM_REF, type,
-                             build_fold_addr_expr (base),
+                             build1 (ADDR_EXPR, TREE_TYPE (arg0), base),
                              int_const_binop (PLUS_EXPR, arg1,
                                               size_int (coffset)));
        }
index 9e5fecd24f7ac5b6ca1814deca569093446774e7..e828b7f9c9ae7c977c4d5c4d9c077e49056cbbe0 100644 (file)
@@ -1,3 +1,8 @@
+2020-03-19  Richard Biener  <rguenther@suse.de>
+
+       PR middle-end/94216
+       * g++.dg/torture/pr94216.C: New testcase.
+
 2020-03-18  Martin Sebor  <msebor@redhat.com>
 
        PR ipa/92799
diff --git a/gcc/testsuite/g++.dg/torture/pr94216.C b/gcc/testsuite/g++.dg/torture/pr94216.C
new file mode 100644 (file)
index 0000000..e67239d
--- /dev/null
@@ -0,0 +1,45 @@
+// { dg-do compile }
+// { dg-additional-options "-g" }
+
+template <int _Nm> struct A { typedef int _Type[_Nm]; };
+template <int _Nm> struct B {
+    typename A<_Nm>::_Type _M_elems;
+    void operator[](int) { int a = *_M_elems; }
+};
+class C {
+    struct D {
+       using type = int *;
+    };
+
+public:
+    using pointer = D::type;
+};
+class F {
+public:
+    using pointer = C::pointer;
+    F(pointer);
+};
+struct G {
+    int data;
+};
+template <int MaxDimensions> struct H {
+    using dimensions_t = B<MaxDimensions>;
+    dimensions_t dimensions;
+    G mem;
+};
+template <int MaxDimensions, typename Allocator, typename DimT, typename AlignT>
+H<MaxDimensions> alloc_view(int, DimT, AlignT, Allocator) {
+    H<MaxDimensions> b;
+    b.dimensions[0];
+    return b;
+}
+namespace memory {
+    template <typename> using DynMdView = H<6>;
+}
+class I {
+    I();
+    memory::DynMdView<void> m_view;
+    F m_memory;
+};
+int c, d, e;
+I::I() : m_view(alloc_view<6>(c, d, e, [] {})), m_memory(&m_view.mem.data) {}