mirror of
https://forge.sourceware.org/marek/gcc.git
synced 2026-02-21 19:35:36 -05:00
Introduce METAFN_KIND_SHIFT and METAFN_KIND_MASK, use it and rewrite
process_metafunction start to use a loop for all 3 arguments. Update copyright years.
This commit is contained in:
committed by
Marek Polacek
parent
f6a3ac7218
commit
967b4e8235
@@ -2,7 +2,7 @@
|
||||
%define class-name metafn_lookup
|
||||
%struct-type
|
||||
%{
|
||||
/* Copyright (C) 2025 Free Software Foundation, Inc.
|
||||
/* Copyright (C) 2025-2026 Free Software Foundation, Inc.
|
||||
Written by Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
This file is part of GCC.
|
||||
@@ -259,6 +259,11 @@ enum metafn_code {
|
||||
METAFN_EXCEPTION__S_EXCEPTION_CVT_FROM_UTF8
|
||||
};
|
||||
|
||||
enum {
|
||||
METAFN_KIND_SHIFT = 5,
|
||||
METAFN_KIND_MASK = (1 << METAFN_KIND_SHIFT) - 1
|
||||
};
|
||||
|
||||
/* Possible return types of metafunctions. */
|
||||
enum metafn_kind_ret {
|
||||
METAFN_KIND_RET_BOOL,
|
||||
@@ -274,6 +279,7 @@ enum metafn_kind_ret {
|
||||
METAFN_KIND_RET_ACCESS_CONTEXT,
|
||||
METAFN_KIND_RET_TEMPLATE_PARM,
|
||||
};
|
||||
static_assert (METAFN_KIND_RET_TEMPLATE_PARM <= (int) METAFN_KIND_MASK);
|
||||
|
||||
/* Possible argument types of metafunctions. */
|
||||
enum metafn_kind_arg {
|
||||
@@ -292,6 +298,7 @@ enum metafn_kind_arg {
|
||||
METAFN_KIND_ARG_TEMPLATE_PARM, /* Some other template parameter. */
|
||||
METAFN_KIND_ARG_TEMPLATE_PARM_REF /* Reference to template parameter. */
|
||||
};
|
||||
static_assert (METAFN_KIND_ARG_TEMPLATE_PARM_REF <= (int) METAFN_KIND_MASK);
|
||||
|
||||
/* Possible sets of 0-3 arguments of metafunctions. */
|
||||
enum metafn_kind_args {
|
||||
@@ -304,95 +311,133 @@ enum metafn_kind_args {
|
||||
METAFN_KIND_ARGS_TEMPLATE_PARM = METAFN_KIND_ARG_TEMPLATE_PARM,
|
||||
METAFN_KIND_ARGS_TEMPLATE_PARM_REF = METAFN_KIND_ARG_TEMPLATE_PARM_REF,
|
||||
METAFN_KIND_ARGS_INFO_INFO
|
||||
= (METAFN_KIND_ARG_INFO << 5) | METAFN_KIND_ARG_INFO,
|
||||
= (METAFN_KIND_ARG_INFO << METAFN_KIND_SHIFT) | METAFN_KIND_ARG_INFO,
|
||||
METAFN_KIND_ARGS_TINFO_TINFO
|
||||
= (METAFN_KIND_ARG_TINFO << 5) | METAFN_KIND_ARG_TINFO,
|
||||
= (METAFN_KIND_ARG_TINFO << METAFN_KIND_SHIFT) | METAFN_KIND_ARG_TINFO,
|
||||
METAFN_KIND_ARGS_TINFO_UNSIGNED
|
||||
= (METAFN_KIND_ARG_UNSIGNED << 5) | METAFN_KIND_ARG_TINFO,
|
||||
= (METAFN_KIND_ARG_UNSIGNED << METAFN_KIND_SHIFT)
|
||||
| METAFN_KIND_ARG_TINFO,
|
||||
METAFN_KIND_ARGS_INFO_ACCESS_CONTEXT
|
||||
= (METAFN_KIND_ARG_ACCESS_CONTEXT << 5) | METAFN_KIND_ARG_INFO,
|
||||
= (METAFN_KIND_ARG_ACCESS_CONTEXT << METAFN_KIND_SHIFT)
|
||||
| METAFN_KIND_ARG_INFO,
|
||||
METAFN_KIND_ARGS_TINFO_DATA_MEMBER_OPTIONS
|
||||
= (METAFN_KIND_ARG_DATA_MEMBER_OPTIONS << 5) | METAFN_KIND_ARG_TINFO,
|
||||
= (METAFN_KIND_ARG_DATA_MEMBER_OPTIONS << METAFN_KIND_SHIFT)
|
||||
| METAFN_KIND_ARG_TINFO,
|
||||
METAFN_KIND_ARGS_INFO_REFLECTION_RANGE
|
||||
= (METAFN_KIND_ARG_REFLECTION_RANGE << 5) | METAFN_KIND_ARG_INFO,
|
||||
= (METAFN_KIND_ARG_REFLECTION_RANGE << METAFN_KIND_SHIFT)
|
||||
| METAFN_KIND_ARG_INFO,
|
||||
METAFN_KIND_ARGS_TINFO_REFLECTION_RANGET
|
||||
= (METAFN_KIND_ARG_REFLECTION_RANGET << 5) | METAFN_KIND_ARG_TINFO,
|
||||
= (METAFN_KIND_ARG_REFLECTION_RANGET << METAFN_KIND_SHIFT)
|
||||
| METAFN_KIND_ARG_TINFO,
|
||||
METAFN_KIND_ARGS_SIZE_T_TINFO
|
||||
= (METAFN_KIND_ARG_TINFO << 5) | METAFN_KIND_ARG_SIZE_T,
|
||||
= (METAFN_KIND_ARG_TINFO << METAFN_KIND_SHIFT) | METAFN_KIND_ARG_SIZE_T,
|
||||
METAFN_KIND_ARGS_TINFO_TINFO_REFLECTION_RANGET
|
||||
= (METAFN_KIND_ARG_REFLECTION_RANGET << 10) | METAFN_KIND_ARGS_TINFO_TINFO,
|
||||
= (METAFN_KIND_ARG_REFLECTION_RANGET << (2 * METAFN_KIND_SHIFT))
|
||||
| METAFN_KIND_ARGS_TINFO_TINFO,
|
||||
};
|
||||
|
||||
/* This encodes metafn_kind_ret in the low METAFN_KIND_SHIFT bits, then
|
||||
first argument metafn_kind_arg in METAFN_KIND_SHIFT bits above that,
|
||||
second argument metafn_kind_arg in METAFN_KIND_SHIFT bits above that
|
||||
and third argument metafn_kind_arg in METAFN_KIND_SHIFT bits above that.
|
||||
Missing argument is METAFN_KIND_ARG_VOID aka 0. */
|
||||
enum metafn_kind {
|
||||
METAFN_KIND_BOOL_INFO
|
||||
= (METAFN_KIND_ARGS_INFO << 5) | METAFN_KIND_RET_BOOL,
|
||||
= (METAFN_KIND_ARGS_INFO << METAFN_KIND_SHIFT) | METAFN_KIND_RET_BOOL,
|
||||
METAFN_KIND_BOOL_TINFO
|
||||
= (METAFN_KIND_ARGS_TINFO << 5) | METAFN_KIND_RET_BOOL,
|
||||
= (METAFN_KIND_ARGS_TINFO << METAFN_KIND_SHIFT) | METAFN_KIND_RET_BOOL,
|
||||
METAFN_KIND_BOOL_INFO_ACCESS_CONTEXT
|
||||
= (METAFN_KIND_ARGS_INFO_ACCESS_CONTEXT << 5) | METAFN_KIND_RET_BOOL,
|
||||
METAFN_KIND_BOOL_TINFO_TINFO
|
||||
= (METAFN_KIND_ARGS_TINFO_TINFO << 5) | METAFN_KIND_RET_BOOL,
|
||||
METAFN_KIND_BOOL_TINFO_REFLECTION_RANGET
|
||||
= (METAFN_KIND_ARGS_TINFO_REFLECTION_RANGET << 5) | METAFN_KIND_RET_BOOL,
|
||||
METAFN_KIND_BOOL_TINFO_TINFO_REFLECTION_RANGET
|
||||
= (METAFN_KIND_ARGS_TINFO_TINFO_REFLECTION_RANGET << 5)
|
||||
= (METAFN_KIND_ARGS_INFO_ACCESS_CONTEXT << METAFN_KIND_SHIFT)
|
||||
| METAFN_KIND_RET_BOOL,
|
||||
METAFN_KIND_INFO_INFO = (METAFN_KIND_ARGS_INFO << 5) | METAFN_KIND_RET_INFO,
|
||||
METAFN_KIND_BOOL_TINFO_TINFO
|
||||
= (METAFN_KIND_ARGS_TINFO_TINFO << METAFN_KIND_SHIFT)
|
||||
| METAFN_KIND_RET_BOOL,
|
||||
METAFN_KIND_BOOL_TINFO_REFLECTION_RANGET
|
||||
= (METAFN_KIND_ARGS_TINFO_REFLECTION_RANGET << METAFN_KIND_SHIFT)
|
||||
| METAFN_KIND_RET_BOOL,
|
||||
METAFN_KIND_BOOL_TINFO_TINFO_REFLECTION_RANGET
|
||||
= (METAFN_KIND_ARGS_TINFO_TINFO_REFLECTION_RANGET << METAFN_KIND_SHIFT)
|
||||
| METAFN_KIND_RET_BOOL,
|
||||
METAFN_KIND_INFO_INFO
|
||||
= (METAFN_KIND_ARGS_INFO << METAFN_KIND_SHIFT) | METAFN_KIND_RET_INFO,
|
||||
METAFN_KIND_INFO_TINFO
|
||||
= (METAFN_KIND_ARGS_TINFO << 5) | METAFN_KIND_RET_INFO,
|
||||
= (METAFN_KIND_ARGS_TINFO << METAFN_KIND_SHIFT) | METAFN_KIND_RET_INFO,
|
||||
METAFN_KIND_INFO_TINFO_REFLECTION_RANGET
|
||||
= (METAFN_KIND_ARGS_TINFO_REFLECTION_RANGET << 5) | METAFN_KIND_RET_INFO,
|
||||
= (METAFN_KIND_ARGS_TINFO_REFLECTION_RANGET << METAFN_KIND_SHIFT)
|
||||
| METAFN_KIND_RET_INFO,
|
||||
METAFN_KIND_INFO_TINFO_DATA_MEMBER_OPTIONS
|
||||
= (METAFN_KIND_ARGS_TINFO_DATA_MEMBER_OPTIONS << 5) | METAFN_KIND_RET_INFO,
|
||||
= (METAFN_KIND_ARGS_TINFO_DATA_MEMBER_OPTIONS << METAFN_KIND_SHIFT)
|
||||
| METAFN_KIND_RET_INFO,
|
||||
METAFN_KIND_INFO_REFLECTION_RANGET
|
||||
= (METAFN_KIND_ARGS_REFLECTION_RANGET << 5) | METAFN_KIND_RET_INFO,
|
||||
= (METAFN_KIND_ARGS_REFLECTION_RANGET << METAFN_KIND_SHIFT)
|
||||
| METAFN_KIND_RET_INFO,
|
||||
METAFN_KIND_INFO_INFO_REFLECTION_RANGE
|
||||
= (METAFN_KIND_ARGS_INFO_REFLECTION_RANGE << 5) | METAFN_KIND_RET_INFO,
|
||||
= (METAFN_KIND_ARGS_INFO_REFLECTION_RANGE << METAFN_KIND_SHIFT)
|
||||
| METAFN_KIND_RET_INFO,
|
||||
METAFN_KIND_INFO_INPUT_RANGE
|
||||
= (METAFN_KIND_ARGS_INPUT_RANGE << 5) | METAFN_KIND_RET_INFO,
|
||||
= (METAFN_KIND_ARGS_INPUT_RANGE << METAFN_KIND_SHIFT)
|
||||
| METAFN_KIND_RET_INFO,
|
||||
METAFN_KIND_INFO_TEMPLATE_PARM
|
||||
= (METAFN_KIND_ARGS_TEMPLATE_PARM << 5) | METAFN_KIND_RET_INFO,
|
||||
= (METAFN_KIND_ARGS_TEMPLATE_PARM << METAFN_KIND_SHIFT)
|
||||
| METAFN_KIND_RET_INFO,
|
||||
METAFN_KIND_INFO_TEMPLATE_PARM_REF
|
||||
= (METAFN_KIND_ARGS_TEMPLATE_PARM_REF << 5) | METAFN_KIND_RET_INFO,
|
||||
= (METAFN_KIND_ARGS_TEMPLATE_PARM_REF << METAFN_KIND_SHIFT)
|
||||
| METAFN_KIND_RET_INFO,
|
||||
METAFN_KIND_INFO_SIZE_T_TINFO
|
||||
= (METAFN_KIND_ARGS_SIZE_T_TINFO << 5) | METAFN_KIND_RET_INFO,
|
||||
= (METAFN_KIND_ARGS_SIZE_T_TINFO << METAFN_KIND_SHIFT)
|
||||
| METAFN_KIND_RET_INFO,
|
||||
METAFN_KIND_MEMBER_OFFSET_INFO
|
||||
= (METAFN_KIND_ARGS_INFO << 5) | METAFN_KIND_RET_MEMBER_OFFSET,
|
||||
= (METAFN_KIND_ARGS_INFO << METAFN_KIND_SHIFT)
|
||||
| METAFN_KIND_RET_MEMBER_OFFSET,
|
||||
METAFN_KIND_OPERATORS_INFO
|
||||
= (METAFN_KIND_ARGS_INFO << 5) | METAFN_KIND_RET_OPERATORS,
|
||||
= (METAFN_KIND_ARGS_INFO << METAFN_KIND_SHIFT)
|
||||
| METAFN_KIND_RET_OPERATORS,
|
||||
METAFN_KIND_SIZE_T_INFO
|
||||
= (METAFN_KIND_ARGS_INFO << 5) | METAFN_KIND_RET_SIZE_T,
|
||||
= (METAFN_KIND_ARGS_INFO << METAFN_KIND_SHIFT) | METAFN_KIND_RET_SIZE_T,
|
||||
METAFN_KIND_SIZE_T_TINFO
|
||||
= (METAFN_KIND_ARGS_TINFO << 5) | METAFN_KIND_RET_SIZE_T,
|
||||
= (METAFN_KIND_ARGS_TINFO << METAFN_KIND_SHIFT) | METAFN_KIND_RET_SIZE_T,
|
||||
METAFN_KIND_SIZE_T_TINFO_UNSIGNED
|
||||
= (METAFN_KIND_ARGS_TINFO_UNSIGNED << 5) | METAFN_KIND_RET_SIZE_T,
|
||||
= (METAFN_KIND_ARGS_TINFO_UNSIGNED << METAFN_KIND_SHIFT)
|
||||
| METAFN_KIND_RET_SIZE_T,
|
||||
METAFN_KIND_SOURCE_LOCATION_INFO
|
||||
= (METAFN_KIND_ARGS_INFO << 5) | METAFN_KIND_RET_SOURCE_LOCATION,
|
||||
= (METAFN_KIND_ARGS_INFO << METAFN_KIND_SHIFT)
|
||||
| METAFN_KIND_RET_SOURCE_LOCATION,
|
||||
METAFN_KIND_STRING_VIEW_INFO
|
||||
= (METAFN_KIND_ARGS_INFO << 5) | METAFN_KIND_RET_STRING_VIEW,
|
||||
= (METAFN_KIND_ARGS_INFO << METAFN_KIND_SHIFT)
|
||||
| METAFN_KIND_RET_STRING_VIEW,
|
||||
METAFN_KIND_STRING_VIEW_OPERATORS
|
||||
= (METAFN_KIND_ARGS_OPERATORS << 5) | METAFN_KIND_RET_STRING_VIEW,
|
||||
= (METAFN_KIND_ARGS_OPERATORS << METAFN_KIND_SHIFT)
|
||||
| METAFN_KIND_RET_STRING_VIEW,
|
||||
METAFN_KIND_U8STRING_VIEW_INFO
|
||||
= (METAFN_KIND_ARGS_INFO << 5) | METAFN_KIND_RET_U8STRING_VIEW,
|
||||
= (METAFN_KIND_ARGS_INFO << METAFN_KIND_SHIFT)
|
||||
| METAFN_KIND_RET_U8STRING_VIEW,
|
||||
METAFN_KIND_U8STRING_VIEW_OPERATORS
|
||||
= (METAFN_KIND_ARGS_OPERATORS << 5) | METAFN_KIND_RET_U8STRING_VIEW,
|
||||
= (METAFN_KIND_ARGS_OPERATORS << METAFN_KIND_SHIFT)
|
||||
| METAFN_KIND_RET_U8STRING_VIEW,
|
||||
METAFN_KIND_STRONG_ORDERING_TINFO_TINFO
|
||||
= (METAFN_KIND_ARGS_TINFO_TINFO << 5) | METAFN_KIND_RET_STRONG_ORDERING,
|
||||
= (METAFN_KIND_ARGS_TINFO_TINFO << METAFN_KIND_SHIFT)
|
||||
| METAFN_KIND_RET_STRONG_ORDERING,
|
||||
METAFN_KIND_VECTOR_INFO_INFO
|
||||
= (METAFN_KIND_ARGS_INFO << 5) | METAFN_KIND_RET_VECTOR_INFO,
|
||||
= (METAFN_KIND_ARGS_INFO << METAFN_KIND_SHIFT)
|
||||
| METAFN_KIND_RET_VECTOR_INFO,
|
||||
METAFN_KIND_VECTOR_INFO_INFO_INFO
|
||||
= (METAFN_KIND_ARGS_INFO_INFO << 5) | METAFN_KIND_RET_VECTOR_INFO,
|
||||
= (METAFN_KIND_ARGS_INFO_INFO << METAFN_KIND_SHIFT)
|
||||
| METAFN_KIND_RET_VECTOR_INFO,
|
||||
METAFN_KIND_VECTOR_INFO_INFO_ACCESS_CONTEXT
|
||||
= (METAFN_KIND_ARGS_INFO_ACCESS_CONTEXT << 5)
|
||||
= (METAFN_KIND_ARGS_INFO_ACCESS_CONTEXT << METAFN_KIND_SHIFT)
|
||||
| METAFN_KIND_RET_VECTOR_INFO,
|
||||
METAFN_KIND_TEMPLATE_PARM_INFO
|
||||
= (METAFN_KIND_ARGS_INFO << 5) | METAFN_KIND_RET_TEMPLATE_PARM,
|
||||
= (METAFN_KIND_ARGS_INFO << METAFN_KIND_SHIFT)
|
||||
| METAFN_KIND_RET_TEMPLATE_PARM,
|
||||
METAFN_KIND_ACCESS_CONTEXT_VOID
|
||||
= (METAFN_KIND_ARGS_VOID << 5) | METAFN_KIND_RET_ACCESS_CONTEXT,
|
||||
= (METAFN_KIND_ARGS_VOID << METAFN_KIND_SHIFT)
|
||||
| METAFN_KIND_RET_ACCESS_CONTEXT,
|
||||
METAFN_KIND_STRING_VIEW_INPUT_RANGE
|
||||
= (METAFN_KIND_ARGS_INPUT_RANGE << 5) | METAFN_KIND_RET_STRING_VIEW,
|
||||
= (METAFN_KIND_ARGS_INPUT_RANGE << METAFN_KIND_SHIFT)
|
||||
| METAFN_KIND_RET_STRING_VIEW,
|
||||
METAFN_KIND_U8STRING_VIEW_INPUT_RANGE
|
||||
= (METAFN_KIND_ARGS_INPUT_RANGE << 5) | METAFN_KIND_RET_U8STRING_VIEW
|
||||
= (METAFN_KIND_ARGS_INPUT_RANGE << METAFN_KIND_SHIFT)
|
||||
| METAFN_KIND_RET_U8STRING_VIEW
|
||||
};
|
||||
%}
|
||||
struct metafn_info
|
||||
|
||||
1065
gcc/cp/metafns.h
1065
gcc/cp/metafns.h
File diff suppressed because it is too large
Load Diff
@@ -1,5 +1,5 @@
|
||||
/* C++ reflection code.
|
||||
Copyright (C) 2025 Free Software Foundation, Inc.
|
||||
Copyright (C) 2025-2026 Free Software Foundation, Inc.
|
||||
Written by Marek Polacek <polacek@redhat.com> and
|
||||
Jakub Jelinek <jakub@redhat.com>.
|
||||
|
||||
@@ -7408,121 +7408,86 @@ process_metafunction (const constexpr_ctx *ctx, tree fun, tree call,
|
||||
return NULL_TREE;
|
||||
}
|
||||
tree h = NULL_TREE, h1 = NULL_TREE, hvec = NULL_TREE, expr = NULL_TREE;
|
||||
tree type = NULL_TREE, info;
|
||||
tree type = NULL_TREE, ht, info;
|
||||
reflect_kind kind = REFLECT_UNDEF;
|
||||
switch ((minfo->kind >> 5) & 31)
|
||||
{
|
||||
case METAFN_KIND_ARG_VOID:
|
||||
break;
|
||||
case METAFN_KIND_ARG_INFO:
|
||||
case METAFN_KIND_ARG_TINFO:
|
||||
info = get_info (ctx, call, 0, non_constant_p, overflow_p, jump_target);
|
||||
if (*jump_target || *non_constant_p)
|
||||
return NULL_TREE;
|
||||
h = REFLECT_EXPR_HANDLE (info);
|
||||
kind = REFLECT_EXPR_KIND (info);
|
||||
if (((minfo->kind >> 5) & 31) == METAFN_KIND_ARG_TINFO)
|
||||
{
|
||||
if (eval_is_type (h) != boolean_true_node)
|
||||
return throw_exception_nontype (loc, ctx, fun, non_constant_p,
|
||||
jump_target);
|
||||
}
|
||||
else
|
||||
{
|
||||
for (int argno = 0; argno < 3; ++argno)
|
||||
switch ((minfo->kind >> ((argno + 1) * METAFN_KIND_SHIFT))
|
||||
& METAFN_KIND_MASK)
|
||||
{
|
||||
case METAFN_KIND_ARG_VOID:
|
||||
break;
|
||||
case METAFN_KIND_ARG_INFO:
|
||||
case METAFN_KIND_ARG_TINFO:
|
||||
gcc_assert (argno < 2);
|
||||
info = get_info (ctx, call, argno, non_constant_p, overflow_p,
|
||||
jump_target);
|
||||
if (*jump_target || *non_constant_p)
|
||||
return NULL_TREE;
|
||||
ht = REFLECT_EXPR_HANDLE (info);
|
||||
if (((minfo->kind >> ((argno + 1) * METAFN_KIND_SHIFT))
|
||||
& METAFN_KIND_MASK) == METAFN_KIND_ARG_TINFO)
|
||||
{
|
||||
if (eval_is_type (ht) != boolean_true_node)
|
||||
return throw_exception_nontype (loc, ctx, fun, non_constant_p,
|
||||
jump_target);
|
||||
}
|
||||
else if (argno == 0)
|
||||
/* There still could be a TEMPLATE_ID_EXPR denoting a function
|
||||
template. */
|
||||
h = resolve_nondeduced_context (h, tf_warning_or_error);
|
||||
}
|
||||
break;
|
||||
case METAFN_KIND_ARG_REFLECTION_RANGE:
|
||||
case METAFN_KIND_ARG_UNSIGNED:
|
||||
case METAFN_KIND_ARG_ACCESS_CONTEXT:
|
||||
case METAFN_KIND_ARG_DATA_MEMBER_OPTIONS:
|
||||
default:
|
||||
gcc_unreachable ();
|
||||
case METAFN_KIND_ARG_REFLECTION_RANGET:
|
||||
hvec = get_type_info_vec (loc, ctx, call, 0, non_constant_p,
|
||||
ht = resolve_nondeduced_context (ht, tf_warning_or_error);
|
||||
if (argno == 0)
|
||||
{
|
||||
kind = REFLECT_EXPR_KIND (info);
|
||||
h = ht;
|
||||
}
|
||||
else
|
||||
h1 = ht;
|
||||
break;
|
||||
case METAFN_KIND_ARG_REFLECTION_RANGE:
|
||||
gcc_assert (argno == 1);
|
||||
hvec = get_info_vec (loc, ctx, call, argno, non_constant_p,
|
||||
overflow_p, jump_target, fun);
|
||||
if (*jump_target || *non_constant_p)
|
||||
return NULL_TREE;
|
||||
break;
|
||||
case METAFN_KIND_ARG_REFLECTION_RANGET:
|
||||
hvec = get_type_info_vec (loc, ctx, call, argno, non_constant_p,
|
||||
overflow_p, jump_target, fun);
|
||||
if (*jump_target || *non_constant_p)
|
||||
return NULL_TREE;
|
||||
break;
|
||||
case METAFN_KIND_ARG_INPUT_RANGE:
|
||||
/* Handled in eval_reflect_constant_*. */
|
||||
break;
|
||||
case METAFN_KIND_ARG_TEMPLATE_PARM:
|
||||
case METAFN_KIND_ARG_TEMPLATE_PARM_REF:
|
||||
type = TREE_VEC_ELT (get_template_innermost_arguments (fun), 0);
|
||||
/* FALLTHRU */
|
||||
case METAFN_KIND_ARG_SIZE_T:
|
||||
case METAFN_KIND_ARG_OPERATORS:
|
||||
expr = get_nth_callarg (call, 0);
|
||||
expr = cxx_eval_constant_expression (ctx, expr, vc_prvalue,
|
||||
non_constant_p, overflow_p,
|
||||
jump_target);
|
||||
if (*jump_target || *non_constant_p)
|
||||
return NULL_TREE;
|
||||
break;
|
||||
}
|
||||
switch ((minfo->kind >> 10) & 31)
|
||||
{
|
||||
case METAFN_KIND_ARG_VOID:
|
||||
break;
|
||||
case METAFN_KIND_ARG_INFO:
|
||||
case METAFN_KIND_ARG_TINFO:
|
||||
info = get_info (ctx, call, 1, non_constant_p, overflow_p, jump_target);
|
||||
if (*jump_target || *non_constant_p)
|
||||
return NULL_TREE;
|
||||
h1 = REFLECT_EXPR_HANDLE (info);
|
||||
if (((minfo->kind >> 10) & 31) == METAFN_KIND_ARG_TINFO)
|
||||
{
|
||||
if (eval_is_type (h1) != boolean_true_node)
|
||||
return throw_exception_nontype (loc, ctx, fun, non_constant_p,
|
||||
jump_target);
|
||||
}
|
||||
break;
|
||||
case METAFN_KIND_ARG_SIZE_T:
|
||||
case METAFN_KIND_ARG_OPERATORS:
|
||||
case METAFN_KIND_ARG_INPUT_RANGE:
|
||||
case METAFN_KIND_ARG_TEMPLATE_PARM:
|
||||
case METAFN_KIND_ARG_TEMPLATE_PARM_REF:
|
||||
default:
|
||||
gcc_unreachable ();
|
||||
case METAFN_KIND_ARG_REFLECTION_RANGE:
|
||||
hvec = get_info_vec (loc, ctx, call, 1, non_constant_p, overflow_p,
|
||||
jump_target, fun);
|
||||
if (*jump_target || *non_constant_p)
|
||||
return NULL_TREE;
|
||||
break;
|
||||
case METAFN_KIND_ARG_REFLECTION_RANGET:
|
||||
hvec = get_type_info_vec (loc, ctx, call, 1, non_constant_p,
|
||||
overflow_p, jump_target, fun);
|
||||
if (*jump_target || *non_constant_p)
|
||||
return NULL_TREE;
|
||||
break;
|
||||
case METAFN_KIND_ARG_UNSIGNED:
|
||||
case METAFN_KIND_ARG_ACCESS_CONTEXT:
|
||||
case METAFN_KIND_ARG_DATA_MEMBER_OPTIONS:
|
||||
expr = get_nth_callarg (call, 1);
|
||||
expr = cxx_eval_constant_expression (ctx, expr, vc_prvalue,
|
||||
non_constant_p, overflow_p,
|
||||
jump_target);
|
||||
if (*jump_target || *non_constant_p)
|
||||
return NULL_TREE;
|
||||
break;
|
||||
}
|
||||
switch ((minfo->kind >> 15) & 31)
|
||||
{
|
||||
case METAFN_KIND_ARG_VOID:
|
||||
break;
|
||||
default:
|
||||
gcc_unreachable ();
|
||||
case METAFN_KIND_ARG_REFLECTION_RANGET:
|
||||
hvec = get_type_info_vec (loc, ctx, call, 2, non_constant_p,
|
||||
overflow_p, jump_target, fun);
|
||||
if (*jump_target || *non_constant_p)
|
||||
return NULL_TREE;
|
||||
break;
|
||||
}
|
||||
if (*jump_target || *non_constant_p)
|
||||
return NULL_TREE;
|
||||
break;
|
||||
case METAFN_KIND_ARG_INPUT_RANGE:
|
||||
/* Handled in eval_reflect_constant_*. */
|
||||
gcc_assert (argno == 0);
|
||||
break;
|
||||
case METAFN_KIND_ARG_TEMPLATE_PARM:
|
||||
case METAFN_KIND_ARG_TEMPLATE_PARM_REF:
|
||||
type = TREE_VEC_ELT (get_template_innermost_arguments (fun), 0);
|
||||
/* FALLTHRU */
|
||||
case METAFN_KIND_ARG_SIZE_T:
|
||||
case METAFN_KIND_ARG_OPERATORS:
|
||||
gcc_assert (argno == 0);
|
||||
expr = get_nth_callarg (call, 0);
|
||||
expr = cxx_eval_constant_expression (ctx, expr, vc_prvalue,
|
||||
non_constant_p, overflow_p,
|
||||
jump_target);
|
||||
if (*jump_target || *non_constant_p)
|
||||
return NULL_TREE;
|
||||
break;
|
||||
case METAFN_KIND_ARG_UNSIGNED:
|
||||
case METAFN_KIND_ARG_ACCESS_CONTEXT:
|
||||
case METAFN_KIND_ARG_DATA_MEMBER_OPTIONS:
|
||||
gcc_assert (argno == 1);
|
||||
expr = get_nth_callarg (call, argno);
|
||||
expr = cxx_eval_constant_expression (ctx, expr, vc_prvalue,
|
||||
non_constant_p, overflow_p,
|
||||
jump_target);
|
||||
if (*jump_target || *non_constant_p)
|
||||
return NULL_TREE;
|
||||
break;
|
||||
default:
|
||||
gcc_unreachable ();
|
||||
}
|
||||
|
||||
switch (minfo->code)
|
||||
{
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
// <meta> -*- C++ -*-
|
||||
|
||||
// Copyright (C) 2025 Free Software Foundation, Inc.
|
||||
// Copyright (C) 2025-2026 Free Software Foundation, Inc.
|
||||
//
|
||||
// This file is part of the GNU ISO C++ Library. This library is free
|
||||
// software; you can redistribute it and/or modify it under the
|
||||
|
||||
Reference in New Issue
Block a user