From 73bc09fa8c6b973a928a599498caa66a25c8bc8d Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Thu, 19 Mar 2020 10:15:52 +0100 Subject: [PATCH] middle-end/94216 fix another build_fold_addr_expr use 2020-03-19 Richard Biener 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 | 6 +++++ gcc/fold-const.c | 2 +- gcc/testsuite/ChangeLog | 5 ++++ gcc/testsuite/g++.dg/torture/pr94216.C | 45 ++++++++++++++++++++++++++++++++++ 4 files changed, 57 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/g++.dg/torture/pr94216.C 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 + + 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 * 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 + + PR middle-end/94216 + * g++.dg/torture/pr94216.C: New testcase. + 2020-03-18 Martin Sebor 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 struct A { typedef int _Type[_Nm]; }; +template 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 struct H { + using dimensions_t = B; + dimensions_t dimensions; + G mem; +}; +template +H alloc_view(int, DimT, AlignT, Allocator) { + H b; + b.dimensions[0]; + return b; +} +namespace memory { + template using DynMdView = H<6>; +} +class I { + I(); + memory::DynMdView 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) {} -- 2.7.4