aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAldy Hernandez <aldyh@redhat.com>2015-03-03 18:14:24 +0000
committerAldy Hernandez <aldyh@gcc.gnu.org>2015-03-03 18:14:24 +0000
commitbf66b9b45c6cf6bccd2791d7c091759b2ad35437 (patch)
tree6878b8e800999efb5ee8039f55e82679f1cf9613
parent71ca36ba7ba0decc431460e09c7d9ac4eebfc77c (diff)
downloadgcc-bf66b9b45c6cf6bccd2791d7c091759b2ad35437.zip
gcc-bf66b9b45c6cf6bccd2791d7c091759b2ad35437.tar.gz
gcc-bf66b9b45c6cf6bccd2791d7c091759b2ad35437.tar.bz2
re PR c++/65295 ([C++1y] constexpr function causes ICE if it returns a local variable bigger than 16 bytes)
PR c++/65295 * constexpr.c (cxx_eval_constant_expression): Remove assert in RESULT_DECL handling. From-SVN: r221161
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/constexpr.c4
-rw-r--r--gcc/testsuite/g++.dg/pr65295.C20
3 files changed, 28 insertions, 2 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 7fcbcb9..3858590 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,9 @@
+2015-03-03 Aldy Hernandez <aldyh@redhat.com>
+
+ PR c++/65295
+ * constexpr.c (cxx_eval_constant_expression): Remove assert in
+ RESULT_DECL handling.
+
2015-02-26 Marek Polacek <polacek@redhat.com>
PR c++/65202
diff --git a/gcc/cp/constexpr.c b/gcc/cp/constexpr.c
index f7e8ce9..1b5f50c 100644
--- a/gcc/cp/constexpr.c
+++ b/gcc/cp/constexpr.c
@@ -2955,8 +2955,8 @@ cxx_eval_constant_expression (const constexpr_ctx *ctx, tree t,
if (lval)
return t;
/* We ask for an rvalue for the RESULT_DECL when indirecting
- through an invisible reference. */
- gcc_assert (DECL_BY_REFERENCE (t));
+ through an invisible reference, or in named return value
+ optimization. */
return (*ctx->values->get (t));
case VAR_DECL:
diff --git a/gcc/testsuite/g++.dg/pr65295.C b/gcc/testsuite/g++.dg/pr65295.C
new file mode 100644
index 0000000..c189ee1
--- /dev/null
+++ b/gcc/testsuite/g++.dg/pr65295.C
@@ -0,0 +1,20 @@
+// { dg-do compile }
+// { dg-options "-std=c++1y" }
+
+struct arr {
+ constexpr arr() : elem() { }
+ char elem[17];
+};
+
+constexpr
+arr f()
+{
+ arr result;
+ return result;
+}
+
+constexpr arr a { f() };
+
+int main()
+{
+}