The problem here was that darwin uses CONST_DECL for an aggregate constant, while the C++ front end expects it to only be used for enumerators. Adjusting that in this one place fixes the testcase.

Tested x86_64-pc-linux-gnu, applying to trunk.
commit e7e659890bfa248aa57eefd62992a71d8d0bd399
Author: Jason Merrill <ja...@redhat.com>
Date:   Thu Jan 22 16:58:01 2015 -0500

    	PR c++/64727
    	* constexpr.c (cxx_eval_constant_expression): Allow for lvalue use
    	of CONST_DECL.

diff --git a/gcc/cp/constexpr.c b/gcc/cp/constexpr.c
index e3e838e..3a33c9f 100644
--- a/gcc/cp/constexpr.c
+++ b/gcc/cp/constexpr.c
@@ -2955,10 +2955,11 @@ cxx_eval_constant_expression (const constexpr_ctx *ctx, tree t,
       return (*ctx->values->get (t));
 
     case VAR_DECL:
+    case CONST_DECL:
+      /* We used to not check lval for CONST_DECL, but darwin.c uses
+	 CONST_DECL for aggregate constants.  */
       if (lval)
 	return t;
-      /* else fall through. */
-    case CONST_DECL:
       if (ctx->strict)
 	r = decl_really_constant_value (t);
       else

Reply via email to