Bootstrapped/regtested on x86_64-pc-linux-gnu, ok for trunk?
-- >8 --
Here we crash on a cp_gimplify_expr/TARGET_EXPR assert:
/* A TARGET_EXPR that expresses direct-initialization should have been
elided by cp_gimplify_init_expr. */
gcc_checking_assert (!TARGET_EXPR_DIRECT_INIT_P (*expr_p));
the TARGET_EXPR in question is created for the NSDMI in:
class Vector { int m_size; };
struct S {
const Vector &vec{};
};
where we first need to create a Vector{} temporary, and then bind the
vec reference to it. The temporary is represented by a TARGET_EXPR
and it cannot be elided. When we create an object of type S, we get
D.2848 = {.vec=(const struct Vector &) &TARGET_EXPR <D.2840, {.m_size=0}>}
where the TARGET_EXPR is no longer direct-initializing anything.
Perhaps we can clear the TARGET_EXPR_DIRECT_INIT_P flag when taking the
address of an TARGET_EXPR, like below. I'm also clearing _ELIDING_P
even though that's not necessary to fix this ICE.
PR c++/114854
gcc/cp/ChangeLog:
* typeck.cc (cp_build_addr_expr_1) <case TARGET_EXPR>: Clear
TARGET_EXPR_DIRECT_INIT_P and TARGET_EXPR_ELIDING_P.
gcc/testsuite/ChangeLog:
* g++.dg/cpp1y/nsdmi-aggr22.C: New test.
---
gcc/cp/typeck.cc | 7 +++++++
gcc/testsuite/g++.dg/cpp1y/nsdmi-aggr22.C | 12 ++++++++++++
2 files changed, 19 insertions(+)
create mode 100644 gcc/testsuite/g++.dg/cpp1y/nsdmi-aggr22.C
diff --git a/gcc/cp/typeck.cc b/gcc/cp/typeck.cc
index 5f16994300f..5707d96a9e7 100644
--- a/gcc/cp/typeck.cc
+++ b/gcc/cp/typeck.cc
@@ -7303,6 +7303,13 @@ cp_build_addr_expr_1 (tree arg, bool strict_lvalue,
tsubst_flags_t complain)
return t;
}
+ case TARGET_EXPR:
+ /* We're going to be taking the address of this TARGET_EXPR, so
+ it cannot be expected to be elided. */
+ TARGET_EXPR_DIRECT_INIT_P (arg) = false;
+ TARGET_EXPR_ELIDING_P (arg) = false;
+ break;
+
default:
break;
}
diff --git a/gcc/testsuite/g++.dg/cpp1y/nsdmi-aggr22.C
b/gcc/testsuite/g++.dg/cpp1y/nsdmi-aggr22.C
new file mode 100644
index 00000000000..a4f9ae19ca9
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp1y/nsdmi-aggr22.C
@@ -0,0 +1,12 @@
+// PR c++/114854
+// { dg-do compile { target c++14 } }
+
+struct Vector {
+ int m_size;
+};
+struct S {
+ const Vector &vec{};
+};
+
+void spawn(S);
+void test() { spawn({}); }
base-commit: 80d1e2ec4d394111ebd50d2e8928f7596b7b5c7e
--
2.45.0