The first operand shall have scalar type. One of the following shall hold for the second and third operands: — both operands have arithmetic type; — both operands have the same structure or union type; — both operands have void type; (snip)
Here, *option is a const struct rb_compile_option_struct. OTOH COMPILE_OPTION_DEFAULT is a struct rb_compile_option_struct, without const. These two are not the "same structure or union type". Hence the expression renders undefined behaviour. COMPILE_OPTION_DEFAULT is not a const because RubyVM::InstructionSequence.compile_option= touches its internals on-the-fly. There is no way to meet the constraints quoted above.
Using ternary operator here was a mistake at the first place. Let's just replace it with a normal if statement.
this ternary operator is an undefined behaviour
Let me quote ISO/IEC 9899:2018 section 6.5.15:
Here,
*optionis a const struct rb_compile_option_struct. OTOHCOMPILE_OPTION_DEFAULTis a struct rb_compile_option_struct, withoutconst. These two are not the "same structure or union type". Hence
the expression renders undefined behaviour. COMPILE_OPTION_DEFAULT is
not a const because
RubyVM::InstructionSequence.compile_option=touches its internals on-the-fly. There is no way to meet the
constraints quoted above.
Using ternary operator here was a mistake at the first place. Let's
just replace it with a normal
ifstatement.