re PR c++/63924 (Constexpr constructible expression "is not constexpr" when used...
authorJason Merrill <jason@redhat.com>
Wed, 19 Nov 2014 03:03:45 +0000 (22:03 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Wed, 19 Nov 2014 03:03:45 +0000 (22:03 -0500)
PR c++/63924
* constexpr.c (cxx_eval_constant_expression) [PARM_DECL]: A load
from a variable of empty class type is constant.

From-SVN: r217749

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

index 32f2c6f330083eabb7c6ae57eaf6f729a2e865c8..5769d2af30ed9eaf17229705ea3512dd21e9bd8c 100644 (file)
@@ -1,5 +1,9 @@
 2014-11-18  Jason Merrill  <jason@redhat.com>
 
+       PR c++/63924
+       * constexpr.c (cxx_eval_constant_expression) [PARM_DECL]: A load
+       from a variable of empty class type is constant.
+
        * constexpr.c (cxx_eval_statement_list): Handle statement-expressions.
        (potential_constant_expression_1): Handle STMT_EXPR.
 
index 1b330a048dfd903baafaf52a96a3cb05d302c1ea..1303fdc4d08a42b438252ef8b3cd29cb7588af4a 100644 (file)
@@ -2845,6 +2845,12 @@ cxx_eval_constant_expression (const constexpr_ctx *ctx, tree t,
        r = *p;
       else if (addr)
        /* Defer in case this is only used for its type.  */;
+      else if (is_empty_class (TREE_TYPE (t)))
+       {
+         /* If the class is empty, we aren't actually loading anything.  */
+         r = build_constructor (TREE_TYPE (t), NULL);
+         TREE_CONSTANT (r) = true;
+       }
       else
        {
          if (!ctx->quiet)
diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-empty8.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-empty8.C
new file mode 100644 (file)
index 0000000..8c1414a
--- /dev/null
@@ -0,0 +1,7 @@
+// PR c++/63924
+// { dg-do compile { target c++11 } }
+
+struct A { };
+constexpr bool f(A a) { return true; }
+template <bool B> constexpr bool g() { return true; }
+constexpr bool g(A a) { return g<f(a)>(); }