Messages in this thread | | | From | Miguel Ojeda <> | Date | Wed, 2 Feb 2022 21:43:08 +0100 | Subject | Re: [PATCH] linux/const.h: Explain how __is_constexpr() works |
| |
On Mon, Jan 31, 2022 at 9:43 PM Kees Cook <keescook@chromium.org> wrote: > > + * - The conditional operator ("... ? ... : ...") returns the type of the > + * operand that isn't a null pointer constant. This behavior is the
Perhaps clarify that this happens only if it fits that case? ...
> + * - If (x) is an integer constant expression, then the "* 0l" resolves it > + * into a null pointer constant, which forces the conditional operator > + * to return the type of the last operand: "(int *)". > + * - If (x) is not an integer constant expression, then the type of the > + * conditional operator is from the first operand: "(void *)".
... i.e. this one happens because it is specified as returning a pointer to void (one could read it as returning the type of the first operand).
What about something like:
- The behavior (including its return type) of the conditional operator ("... ? ... : ...") depends on the kind of expressions given for the second and third operands. This is the central mechanism of the macro. - If (x) is an integer constant expression, then the "* 0l" resolves it into a null pointer constant. When one operand is a null pointer constant and the other is a pointer, the conditional operator returns the type of the pointer operand; that is, "int *". - If (x) is not an integer constant expression, then that operand is a pointer to void (but not a null pointer constant). When one operand is a pointer to void and the other a pointer to an object type, the conditional operator returns a "void *" type.
Cheers, Miguel
| |