re PR c++/51406 ([c++0x] Incorrect result of static_cast to rvalue reference to base...
authorJason Merrill <jason@redhat.com>
Thu, 3 Mar 2016 22:43:09 +0000 (17:43 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Thu, 3 Mar 2016 22:43:09 +0000 (17:43 -0500)
PR c++/51406

* typeck.c (build_static_cast_1): Avoid folding back to lvalue.

From-SVN: r233946

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

index f2c9cd25c1bb64537773e5df908dd35c3c99f090..a7ae483c33d5261bc1d2b5fbf4dc445fee9854c1 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 51458798c5ba2a17ca80d7c44d156db880803533..20f0afc74d7a5691e267647e1d8cd6e8d5caa7fb 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}();
+}