re PR c++/51318 (segfault on Eigen3)
authorJason Merrill <jason@redhat.com>
Thu, 8 Dec 2011 22:28:38 +0000 (17:28 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Thu, 8 Dec 2011 22:28:38 +0000 (17:28 -0500)
PR c++/51318
* typeck.c (build_x_conditional_expr): Restrict glvalue games to C++11.

From-SVN: r182142

gcc/cp/ChangeLog
gcc/cp/typeck.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/template/cond8.C [new file with mode: 0644]

index 70a93bd..14e65c0 100644 (file)
@@ -1,5 +1,8 @@
 2011-12-08  Jason Merrill  <jason@redhat.com>
 
+       PR c++/51318
+       * typeck.c (build_x_conditional_expr): Restrict glvalue games to C++11.
+
        PR c++/51459
        * pt.c (tsubst_expr) [DECL_EXPR]: Handle capture proxies properly.
        * semantics.c (insert_capture_proxy): No longer static.
index 9a5365c..4973d7d 100644 (file)
@@ -5517,8 +5517,10 @@ build_x_conditional_expr (tree ifexp, tree op1, tree op2,
     {
       tree min = build_min_non_dep (COND_EXPR, expr,
                                    orig_ifexp, orig_op1, orig_op2);
-      /* Remember that the result is an lvalue or xvalue.  */
-      if (lvalue_or_rvalue_with_address_p (expr)
+      /* In C++11, remember that the result is an lvalue or xvalue.
+         In C++98, lvalue_kind can just assume lvalue in a template.  */
+      if (cxx_dialect >= cxx0x
+         && lvalue_or_rvalue_with_address_p (expr)
          && !lvalue_or_rvalue_with_address_p (min))
        TREE_TYPE (min) = cp_build_reference_type (TREE_TYPE (min),
                                                   !real_lvalue_p (expr));
index 5c97305..9d4f286 100644 (file)
@@ -1,5 +1,8 @@
 2011-12-08  Jason Merrill  <jason@redhat.com>
 
+       PR c++/51318
+       * g++.dg/template/cond8.C: New.
+
        PR c++/51459
        * g++.dg/cpp0x/lambda/lambda-template4.C: New.
 
diff --git a/gcc/testsuite/g++.dg/template/cond8.C b/gcc/testsuite/g++.dg/template/cond8.C
new file mode 100644 (file)
index 0000000..a3bad7e
--- /dev/null
@@ -0,0 +1,10 @@
+// PR c++/51318
+
+enum { e0, e1 };
+
+template<bool B, int = B ? e0 : e1> struct A {};
+
+template<typename T> struct B
+{
+  A<T::X> a;
+};