aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@gcc.gnu.org>2019-02-05 23:28:25 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2019-02-05 23:28:25 +0100
commitd397e3948ec945c8c3b4dc695e1b0b5820365a39 (patch)
treed28c490bd10459d8af9c855f87d56d907710a30b
parent216090cc0fb7dc4de5fa9176860c845d5646c6b7 (diff)
downloadgcc-d397e3948ec945c8c3b4dc695e1b0b5820365a39.zip
gcc-d397e3948ec945c8c3b4dc695e1b0b5820365a39.tar.gz
gcc-d397e3948ec945c8c3b4dc695e1b0b5820365a39.tar.bz2
re PR c++/89187 (ICE in initialize_argument_information, at calls.c:2023)
PR c++/89187 * optimize.c (maybe_thunk_body): Clear TREE_ADDRESSABLE on PARM_DECLs of the thunk. * lambda.c (maybe_add_lambda_conv_op): Likewise. * g++.dg/opt/pr89187.C: New test. From-SVN: r268564
-rw-r--r--gcc/cp/ChangeLog7
-rw-r--r--gcc/cp/lambda.c3
-rw-r--r--gcc/cp/optimize.c2
-rw-r--r--gcc/testsuite/ChangeLog7
-rw-r--r--gcc/testsuite/g++.dg/opt/pr89187.C23
5 files changed, 41 insertions, 1 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 8ebbc12..660d746 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,10 @@
+2019-02-05 Jakub Jelinek <jakub@redhat.com>
+
+ PR c++/89187
+ * optimize.c (maybe_thunk_body): Clear TREE_ADDRESSABLE on
+ PARM_DECLs of the thunk.
+ * lambda.c (maybe_add_lambda_conv_op): Likewise.
+
2019-02-05 Marek Polacek <polacek@redhat.com>
PR c++/89158 - by-value capture of constexpr variable broken.
diff --git a/gcc/cp/lambda.c b/gcc/cp/lambda.c
index c31b06e..2290fe0 100644
--- a/gcc/cp/lambda.c
+++ b/gcc/cp/lambda.c
@@ -1130,6 +1130,9 @@ maybe_add_lambda_conv_op (tree type)
{
tree new_node = copy_node (src);
+ /* Clear TREE_ADDRESSABLE on thunk arguments. */
+ TREE_ADDRESSABLE (new_node) = 0;
+
if (!fn_args)
fn_args = tgt = new_node;
else
diff --git a/gcc/cp/optimize.c b/gcc/cp/optimize.c
index 7b6edfc..aace7de 100644
--- a/gcc/cp/optimize.c
+++ b/gcc/cp/optimize.c
@@ -417,6 +417,8 @@ maybe_thunk_body (tree fn, bool force)
gcc_assert (clone_parm);
DECL_ABSTRACT_ORIGIN (clone_parm) = NULL;
args[parmno] = clone_parm;
+ /* Clear TREE_ADDRESSABLE on thunk arguments. */
+ TREE_ADDRESSABLE (clone_parm) = 0;
clone_parm = TREE_CHAIN (clone_parm);
}
if (fn_parm_typelist)
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 6167416..ac70c72 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,4 +1,9 @@
-2019-02-05 Andrea Corallo <andrea.corallo@arm.com>
+2019-02-05 Jakub Jelinek <jakub@redhat.com>
+
+ PR c++/89187
+ * g++.dg/opt/pr89187.C: New test.
+
+2019-02-05 Andrea Corallo <andrea.corallo@arm.com>
* jit.dg/add-driver-options-testlib.c: Add support file for
test-add-driver-options.c testcase.
diff --git a/gcc/testsuite/g++.dg/opt/pr89187.C b/gcc/testsuite/g++.dg/opt/pr89187.C
new file mode 100644
index 0000000..3e24a8f
--- /dev/null
+++ b/gcc/testsuite/g++.dg/opt/pr89187.C
@@ -0,0 +1,23 @@
+// PR c++/89187
+// { dg-do compile { target c++11 } }
+// { dg-options "-Os -fno-tree-ccp -fno-tree-sra -fno-inline" }
+
+template <typename T, int N> struct A {
+ typedef T __attribute__((vector_size (N))) type;
+};
+template <typename T, int N> using B = typename A<T, N>::type;
+template <typename T> using C = B<T, 4>;
+struct D {
+ D (C<int> x) : d{x[3]} {}
+ D foo () { return d; }
+ C<int> d;
+};
+extern D d;
+struct { D bar () { return d; } } l;
+struct E { void baz () const; };
+
+void
+E::baz () const
+{
+ l.bar ().foo ();
+}