re PR c++/64547 (A non-const constexpr function is rejected incorrectly)
authorJason Merrill <jason@redhat.com>
Mon, 12 Jan 2015 14:15:07 +0000 (09:15 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Mon, 12 Jan 2015 14:15:07 +0000 (09:15 -0500)
PR c++/64547
* constexpr.c (cxx_eval_call_expression): A call to a void
function doesn't need to return a value.

From-SVN: r219466

gcc/cp/ChangeLog
gcc/cp/constexpr.c
gcc/testsuite/g++.dg/cpp1y/constexpr-void2.C [new file with mode: 0644]

index f60141d7beb4542a46d6fc59d3372bfe7e14f4c7..14e1fb323c26f9e174b4eedb2262ca37c1b97b4b 100644 (file)
@@ -1,3 +1,9 @@
+2015-01-12  Jason Merrill  <jason@redhat.com>
+
+       PR c++/64547
+       * constexpr.c (cxx_eval_call_expression): A call to a void
+       function doesn't need to return a value.
+
 2015-01-09  Michael Collison  <michael.collison@linaro.org>
 
        * call.c: Include hash-set.h, machmode.h, vec.h, double-int.h,
index 9a0d518450f3f9f47884dd4df8acc1778d7cfa53..650250b015acfc4e0486f7c518870d43a2f2fc57 100644 (file)
@@ -1386,6 +1386,8 @@ cxx_eval_call_expression (const constexpr_ctx *ctx, tree t,
                   value by evaluating *this, but we don't bother; there's
                   no need to put such a call in the hash table.  */
                result = lval ? ctx->object : ctx->ctor;
+             else if (VOID_TYPE_P (TREE_TYPE (res)))
+               result = void_node;
              else
                {
                  result = *ctx->values->get (slot ? slot : res);
diff --git a/gcc/testsuite/g++.dg/cpp1y/constexpr-void2.C b/gcc/testsuite/g++.dg/cpp1y/constexpr-void2.C
new file mode 100644 (file)
index 0000000..321a35e
--- /dev/null
@@ -0,0 +1,21 @@
+// PR c++/64547
+// { dg-do compile { target c++14 } }
+
+struct X
+{
+    int x;
+    constexpr int get() const {return x;}
+    constexpr void set(int foo) {x = foo;}
+};
+
+constexpr int bar()
+{
+    X x{42};
+    x.set(666);
+    return x.get();
+}
+
+int main()
+{
+    constexpr int foo = bar();
+}