if (TREE_CODE (*p) == TARGET_EXPR
/* An eliding TARGET_EXPR isn't a temporary at all. */
&& !TARGET_EXPR_ELIDING_P (*p)
- /* A TARGET_EXPR with CLEANUP_EH_ONLY is an artificial variable used
- during initialization, and need not be extended. */
- && !CLEANUP_EH_ONLY (*p))
+ /* A TARGET_EXPR with TARGET_EXPR_INTERNAL_P is an artificial variable
+ used during initialization that need not be extended. */
+ && !TARGET_EXPR_INTERNAL_P (*p))
{
+ /* A CLEANUP_EH_ONLY expr should also have TARGET_EXPR_INTERNAL_P. */
+ gcc_checking_assert (!CLEANUP_EH_ONLY (*p));
+
tree subinit = NULL_TREE;
tree slot = TARGET_EXPR_SLOT (*p);
*p = set_up_extended_ref_temp (d->decl, *p, d->cleanups, &subinit,
OVL_LOOKUP_P (in OVERLOAD)
LOOKUP_FOUND_P (in RECORD_TYPE, UNION_TYPE, ENUMERAL_TYPE, NAMESPACE_DECL)
FNDECL_MANIFESTLY_CONST_EVALUATED (in FUNCTION_DECL)
+ TARGET_EXPR_INTERNAL_P (in TARGET_EXPR)
5: IDENTIFIER_VIRTUAL_P (in IDENTIFIER_NODE)
FUNCTION_RVALUE_QUALIFIED (in FUNCTION_TYPE, METHOD_TYPE)
CALL_EXPR_REVERSE_ARGS (in CALL_EXPR, AGGR_INIT_EXPR)
#define TARGET_EXPR_ELIDING_P(NODE) \
TREE_LANG_FLAG_3 (TARGET_EXPR_CHECK (NODE))
+/* True if this TARGET_EXPR is for holding an implementation detail like a
+ cleanup flag or loop index, and should be ignored by extend_all_temps. */
+#define TARGET_EXPR_INTERNAL_P(NODE) \
+ TREE_LANG_FLAG_4 (TARGET_EXPR_CHECK (NODE))
+
/* True if NODE is a TARGET_EXPR that just expresses a copy of its INITIAL; if
the initializer has void type, it's doing something more complicated. */
#define SIMPLE_TARGET_EXPR_P(NODE) \
init = convert_bitfield_to_declared_type (init);
tree t = build_target_expr_with_type (init, TREE_TYPE (init),
tf_warning_or_error);
- /* No internal variable should have a cleanup on the normal path, and
- extend_temps_r checks this flag to decide whether to extend. */
- CLEANUP_EH_ONLY (t) = true;
+ TARGET_EXPR_INTERNAL_P (t) = true;
return t;
}
{
tree tx = get_internal_target_expr (boolean_true_node);
tree flag = TARGET_EXPR_SLOT (tx);
- CLEANUP_EH_ONLY (tx) = true;
TARGET_EXPR_CLEANUP (tx) = build3 (COND_EXPR, void_type_node,
flag, cleanup, void_node);
add_stmt (tx);
--- /dev/null
+// { dg-do run { target c++11 } }
+// { dg-options "" }
+
+extern "C" void abort ();
+
+int a;
+struct A {
+ A() { ++a; }
+ A(int);
+ A(const A&);
+ ~A() { --a; }
+};
+
+struct B {
+ A a1;
+ A a2;
+};
+
+int main()
+{
+ {
+ B b = { A(), A(({goto out; 42;})) };
+ }
+ out:
+ if (a != 0)
+ abort ();
+}