/* $NetBSD: lsym_unary_op.c,v 1.13 2023/10/22 21:03:08 rillig Exp $ */

/*
* Tests for the token lsym_unary_op, which represents a unary operator.
*
* In an expression, a unary operator is written without blank next to its
* argument.
*
* In a type name, the "unary operator" '*' represents the derivation of a
* pointer type.
*
* See also:
*      lsym_binary_op.c
*      lsym_postfix_op.c
*      C11 6.4.6 "Punctuators"
*      C11 6.5 "Expressions"
*/

//indent input
void
unary_operators(void)
{
       /* In the order of appearance in C11 6.5. */
       function(a++, a--, ++a, --a, &a, *a, +a, -a, ~a, !a);
}
//indent end

//indent run-equals-input


/*
* The unary operators '+' and '-' can occur in long chains.  In these chains,
* adjacent '+' must not be merged to '++' since that would be a different
* token.  The same applies to '&', but that case is irrelevant in practice
* since the address of an address cannot be taken.
*/
//indent input
int var=+3;
int mixed=+-+-+-+-+-+-+-+-+-+-+-+-+-3;
int count=~-~-~-~-~-~-~-~-~-~-~-~-~-3;
int same = + + + + + - - - - - 3;
//indent end

//indent run -di0
int var = +3;
int mixed = +-+-+-+-+-+-+-+-+-+-+-+-+-3;
int count = ~-~-~-~-~-~-~-~-~-~-~-~-~-3;
int same = + + + + +- - - - -3;
//indent end


/*
* The operator '->' is special as it additionally suppresses the space between
* the operator and its right operand.
*/
//indent input
int var = p -> member;
//indent end

//indent run -di0
int var = p->member;
//indent end


//indent input
void
unary_operators(void)
{
       ++prefix_increment;
       --prefix_decrement;
       int *address = &lvalue;
       int dereferenced = *address;
       int positive = +number;
       int negative = -number;
       bool negated = !condition;
}
//indent end

//indent run-equals-input -di0


/*
* Ensure that a '*' is not interpreted as unary operator in situations that
* may look like a cast expression.
*/
//indent input
{
       sbuf_t *sb = *(sbuf_t **)sp;
       return (int)(a * (float)b);
       a = (2 * b == c);
}
//indent end

//indent run-equals-input -di0


/* All asterisks from a pointer type are merged into a single token. */
//indent input
{
char*
*
*
*x;
char
*
*
*
*x;
}
//indent end

//indent run
{
       char        ****x;
       char
                   ****x;
}
//indent end