[PATCH] c++, libstdc++, v5: Implement C++26 P3726R2 - Adjustments to Union Lifetime Rules [PR125845]
Marek Polacek
polacek@redhat.com
Wed Sep 9 16:08:33 GMT 2026
On Wed, Sep 09, 2026 at 05:22:24PM +0200, Jakub Jelinek wrote:
> On Wed, Sep 09, 2026 at 10:00:48AM -0400, Jason Merrill wrote:
> > On 9/9/26 6:08 AM, Jakub Jelinek wrote:
> > > On Wed, Sep 09, 2026 at 12:06:14PM +0200, Tomasz Kaminski wrote:
> --- a/gcc/cp/cp-gimplify.cc 2026-09-09 17:03:29.375511108 +0200
> +++ b/gcc/cp/cp-gimplify.cc 2026-09-09 17:08:09.020290280 +0200
> @@ -1040,6 +1040,7 @@ cp_gimplify_expr (tree *expr_p, gimple_s
> 0));
> break;
> case CP_BUILT_IN_CONSTEXPR_DIAG:
> + case CP_BUILT_IN_START_LIFETIME:
> *expr_p = void_node;
Is it safe to drop this when the argument has side-effects?
> break;
> default:
> --- a/gcc/cp/semantics.cc 2026-09-09 17:03:29.386510966 +0200
> +++ b/gcc/cp/semantics.cc 2026-09-09 17:08:09.021167493 +0200
> @@ -3300,6 +3300,82 @@ perform_koenig_lookup (cp_expr fn_expr,
> return cp_expr (fn, loc);
> }
>
> +/* Analyze call to a front-end builtin FN with arguments *ARGS. Return true
> + if the call is correct, false if erroneous. */
> +
> +static bool
> +check_frontend_builtin (tree fn, vec<tree, va_gc> **args,
> + tsubst_flags_t complain)
> +{
> + tree arg, ptype, type;
> + switch (DECL_UNCHECKED_FUNCTION_CODE (fn))
> + {
> + case CP_BUILT_IN_IS_WITHIN_LIFETIME:
> + /* Unless users call the builtin directly, the following 2 checks
> + should be ensured from std::is_within_lifetime template. */
> + if (vec_safe_length (*args) != 1)
> + {
> + if (complain & tf_error)
> + error ("%qs needs a single argument",
> + "__builtin_is_within_lifetime");
> + return false;
> + }
> + arg = (**args)[0];
> + if (error_operand_p (arg))
> + return false;
> + ptype = TREE_TYPE (arg);
> + if (!POINTER_TYPE_P (ptype))
> + {
> + if (complain & tf_error)
> + error ("%qs argument type %qT is not pointer type",
> + "__builtin_is_within_lifetime", ptype);
> + return false;
> + }
> + return true;
> + case CP_BUILT_IN_START_LIFETIME:
This:
> + /* Unless users call the builtin directly, the following 2 checks
> + should be ensured from std::start_lifetime template. */
> + if (vec_safe_length (*args) != 1)
> + {
> + if (complain & tf_error)
> + error ("%qs needs a single argument", "__builtin_start_lifetime");
> + return false;
> + }
> + arg = (**args)[0];
> + if (error_operand_p (arg))
> + return false;
> + ptype = TREE_TYPE (arg);
> + if (!POINTER_TYPE_P (ptype))
> + {
> + if (complain & tf_error)
> + error ("%qs argument type %qT is not pointer type",
> + "__builtin_start_lifetime", ptype);
> + return false;
> + }
seems to duplicate the previous case almost verbatim.
> + type = TREE_TYPE (ptype);
> + if (!complete_type_or_else (type, NULL_TREE))
This emits a diagnostic unconditionally, should it be
complete_type_or_maybe_complain? Elsewhere this function
checks complain first.
Marek
More information about the Libstdc++
mailing list