aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2020-03-19 10:15:52 +0100
committerRichard Biener <rguenther@suse.de>2020-03-19 10:18:01 +0100
commit73bc09fa8c6b973a928a599498caa66a25c8bc8d (patch)
treeb05b87310a0bca42f13f0e8d6949193424a819d5 /gcc
parentb5562f1187d47b0e8a20687a8d31d00c187aada9 (diff)
downloadgcc-73bc09fa8c6b973a928a599498caa66a25c8bc8d.zip
gcc-73bc09fa8c6b973a928a599498caa66a25c8bc8d.tar.gz
gcc-73bc09fa8c6b973a928a599498caa66a25c8bc8d.tar.bz2
middle-end/94216 fix another build_fold_addr_expr use
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.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/fold-const.c2
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/torture/pr94216.C45
4 files changed, 57 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 66202f0..f015a55 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
diff --git a/gcc/fold-const.c b/gcc/fold-const.c
index 3ab1a9a..9267914 100644
--- a/gcc/fold-const.c
+++ b/gcc/fold-const.c
@@ -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)));
}
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 9e5fecd..e828b7f 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 0000000..e67239de9
--- /dev/null
+++ b/gcc/testsuite/g++.dg/torture/pr94216.C
@@ -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) {}