Hi Andrew,

On 2023/10/31 14:48, Andrew Pinski wrote:
+inline
+gimple_match_op::gimple_match_op (const gimple_match_cond &cond_in,
+                                 code_helper code_in, tree type_in,
+                                 tree op0, tree op1, tree op2, tree op3,
+                                 tree op4, tree op5)
+  : cond (cond_in), code (code_in), type (type_in), reverse (false),
+    num_ops (6)
+{
+  ops[0] = op0;
+  ops[1] = op1;
+  ops[2] = op2;
+  ops[3] = op3;
+  ops[4] = op4;
+  ops[5] = op5;
+}
Hmm, does it make sense to start to use variadic templates for these
constructors instead of writing them out?
And we can even add a static_assert to make sure the number of
arguments is <= MAX_NUM_OPS to make sure they are correct. And use
std::is_same to make sure we are only passing tree types.

You mean something like this?:

template<typename... op_types>
inline
gimple_match_op::gimple_match_op (const gimple_match_cond &cond_in,
                                  code_helper code_in, tree type_in,
                                  op_types... ops)
  : cond (cond_in), code (code_in), type (type_in), reverse (false),
    num_ops (sizeof...(ops))
{
  static_assert (sizeof...(ops) <= MAX_NUM_OPS);
  auto op_list[] = {ops...};
  for (int i = 0; i < sizeof...(ops); i++)
    this->ops[i] = op_list[i];
}

--
Best,
Lehua (RiVAI)
lehua.d...@rivai.ai

Reply via email to