Commit 16dc6b17 by Jason Merrill Committed by Jason Merrill

re PR c++/51406 ([c++0x] Incorrect result of static_cast to rvalue reference to base class.)

	PR c++/51406

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

From-SVN: r233946
parent 639475f0
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.
......
......@@ -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
......
// { 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}();
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment