@@ -5402,6 +5402,11 @@ build_conditional_expr (const op_location_t &loc,
arg1 = cp_stabilize_reference (arg1);
arg2 = arg1 = prevent_lifetime_extension (arg1);
}
+ else if (TREE_CODE (arg1) == TARGET_EXPR)
+ /* arg1 can't be a prvalue result of the conditional
+ expression, since it needs to be materialized for the
+ conversion to bool, so treat it as an xvalue in arg2. */
+ arg2 = move (TARGET_EXPR_SLOT (arg1));
else
arg2 = arg1 = cp_save_expr (arg1);
}
@@ -1,10 +1,14 @@
// PR c++/93046
-// { dg-do compile }
+// { dg-do run }
// { dg-options "" }
+int c;
+
struct S {
- S (int);
- operator bool ();
+ int i;
+ S (int i) : i(i) { ++c; }
+ S (const S &s): i(s.i) { ++c; }
+ operator bool () { return i; }
};
S
@@ -12,3 +16,10 @@ foo ()
{
return S (1) ? : S (2);
}
+
+int main()
+{
+ S s = foo();
+ if (s.i != 1 || c != 2)
+ __builtin_abort ();
+}