aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2017-06-20 12:47:17 -0400
committerJason Merrill <jason@gcc.gnu.org>2017-06-20 12:47:17 -0400
commitd276da0cf5bff87311330b395d3918b569bbbcc3 (patch)
treec816f4336b58d4f41ba37ddb8f2d053cf9431507
parent1e5d2102752fbb804c68773d2afeaccebbc9d771 (diff)
downloadgcc-d276da0cf5bff87311330b395d3918b569bbbcc3.zip
gcc-d276da0cf5bff87311330b395d3918b569bbbcc3.tar.gz
gcc-d276da0cf5bff87311330b395d3918b569bbbcc3.tar.bz2
PR c++/80972 - C++17 ICE with attribute packed.
* call.c (build_over_call): Allow a TARGET_EXPR from reference binding. From-SVN: r249420
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/call.c2
-rw-r--r--gcc/testsuite/g++.dg/ext/packed12.C6
3 files changed, 14 insertions, 0 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 5786cba..01230c0 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,9 @@
+2017-06-20 Jason Merrill <jason@redhat.com>
+
+ PR c++/80972 - C++17 ICE with attribute packed.
+ * call.c (build_over_call): Allow a TARGET_EXPR from reference
+ binding.
+
2017-06-20 Nathan Sidwell <nathan@acm.org>
* cp-tree.h (CPTI_NELTS_IDENTIFIER): Delete.
diff --git a/gcc/cp/call.c b/gcc/cp/call.c
index d1f27dd..b56da35 100644
--- a/gcc/cp/call.c
+++ b/gcc/cp/call.c
@@ -8025,6 +8025,8 @@ build_over_call (struct z_candidate *cand, int flags, tsubst_flags_t complain)
subobject. */
if (CHECKING_P && cxx_dialect >= cxx1z)
gcc_assert (TREE_CODE (arg) != TARGET_EXPR
+ /* It's from binding the ref parm to a packed field. */
+ || convs[0]->need_temporary_p
|| seen_error ()
/* See unsafe_copy_elision_p. */
|| DECL_BASE_CONSTRUCTOR_P (fn));
diff --git a/gcc/testsuite/g++.dg/ext/packed12.C b/gcc/testsuite/g++.dg/ext/packed12.C
new file mode 100644
index 0000000..2ad14de
--- /dev/null
+++ b/gcc/testsuite/g++.dg/ext/packed12.C
@@ -0,0 +1,6 @@
+// PR c++/80972
+
+struct A { int i; };
+struct B { A a; } __attribute__((packed));
+
+A a = B().a;