PR c++/51406
authorjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 3 Mar 2016 22:43:09 +0000 (22:43 +0000)
committerjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 3 Mar 2016 22:43:09 +0000 (22:43 +0000)
* typeck.c (build_static_cast_1): Avoid folding back to lvalue.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@233946 138bc75d-0d04-0410-961f-82ee72b054a4

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

index f2c9cd2..a7ae483 100644 (file)
@@ -1,5 +1,8 @@
 2016-03-03  Jason Merrill  <jason@redhat.com>
 
+       PR c++/51406
+       * typeck.c (build_static_cast_1): Avoid folding back to lvalue.
+
        PR c++/67364
        * constexpr.c (cxx_eval_component_reference): Just return an empty
        CONSTRUCTOR for an empty class.
index 5145879..20f0afc 100644 (file)
@@ -6704,11 +6704,7 @@ build_static_cast_1 (tree type, tree expr, bool c_cast_p,
          tree lref = cp_build_reference_type (TREE_TYPE (type), false);
          result = (perform_direct_initialization_if_possible
                    (lref, expr, c_cast_p, complain));
-         result = cp_fold_convert (type, result);
-         /* Make sure we don't fold back down to a named rvalue reference,
-            because that would be an lvalue.  */
-         if (DECL_P (result))
-           result = build1 (NON_LVALUE_EXPR, type, result);
+         result = build1 (NON_LVALUE_EXPR, type, result);
          return convert_from_reference (result);
        }
       else
diff --git a/gcc/testsuite/g++.dg/cpp0x/rv-cast5.C b/gcc/testsuite/g++.dg/cpp0x/rv-cast5.C
new file mode 100644 (file)
index 0000000..c2473e2
--- /dev/null
@@ -0,0 +1,12 @@
+// { dg-do compile { target c++11 } }
+
+template <typename T>
+struct hold {
+  T value;
+  constexpr T&& operator()() && { return static_cast<T&&>(value); }
+};
+
+int main()
+{
+  hold<bool&&>{42}();
+}