/*	$NetBSD: ops.def,v 1.29 2022/06/15 18:44:41 rillig Exp $ */

begin_ops()

/*
 * Operator properties; see mod_t in op.h.
 *
 *	warn if operand '='					      x
 *	bad on enum						    x
 *	valid on enum						  x
 *	comparison		- - - - - - - - - - - - - - - - x
 *	possible precedence confusion			      x	|
 *	warn if right operand unsigned			    x	|
 *	warn if left operand unsigned			  x	|
 *	has side effects	- - - - - - - - - - - - x	|
 *	balance operands			      x	|	|
 *	(unused)				    x	|	|
 *	value context				  x	|	|
 *	fold constant operands	- - - - - - - - x	|	|
 *	requires scalar			      x	|	|	|
 *	requires arithmetic		    x	|	|	|
 *	requires integer or complex	  x	|	|	|
 *	requires integer	- - - - x	|	|	|
 *	compares with zero	      x	|	|	|	|
 *	takes _Bool		    x	|	|	|	|
 *	logical			  x	|	|	|	|
 *	binary			x	|	|	|	|
 */
/*	name	repr		b l b z i c a s f v - b s l r p c e e =	*/
op(	NOOP,	"no-op",	 , , , , , , , , , , , , , , , , , , , )
op(	ARROW,	"->",		1, ,1, , , , , , ,1, , , , , , , , , , )
op(	POINT,	".",		1, ,1, , , , , , , , , , , , , , , , , )
op(	NOT,	"!",		 ,1,1,1, , , ,1,1, , , , , , , , , ,1, )
op(	COMPL,	"~",		 , , , , ,1, , ,1,1, , , , , , , , ,1,1)
op(	INC,	"++",		 , , , , , , , , , , , , , , , , , , , )
op(	DEC,	"--",		 , , , , , , , , , , , , , , , , , , , )
op(	INCBEF,	"++x",		 , , , , , , ,1, , , , ,1, , , , , ,1, )
op(	DECBEF,	"--x",		 , , , , , , ,1, , , , ,1, , , , , ,1, )
op(	INCAFT,	"x++",		 , , , , , , ,1, , , , ,1, , , , , ,1, )
op(	DECAFT,	"x--",		 , , , , , , ,1, , , , ,1, , , , , ,1, )
op(	UPLUS,	"+",		 , , , , , ,1, ,1,1, , , , , , , , ,1,1)
op(	UMINUS,	"-",		 , , , , , ,1, ,1,1, , , ,1, , , , ,1,1)
op(	INDIR,	"*",		 , , , , , , , , ,1, , , , , , , , , , )
op(	ADDR,	"&",		 , ,1, , , , , , , , , , , , , , , , , )
/* the operator 'arr[ind]' is translated to '*(arr + ind)' during parsing. */

/*	name	repr		b l b z i c a s f v - b s l r p c e e =	*/
op(	MULT,	"*",		1, , , , , ,1, ,1,1, ,1, , ,1, , , ,1,1)
op(	DIV,	"/",		1, , , , , ,1, ,1,1, ,1, ,1,1, , , ,1,1)
op(	MOD,	"%",		1, , , ,1, , , ,1,1, ,1, ,1,1, , , ,1,1)
op(	PLUS,	"+",		1, , , , , , ,1,1,1, ,1, , , , , , ,1, )
op(	MINUS,	"-",		1, , , , , , ,1,1,1, ,1, , , , , , ,1, )
op(	SHL,	"<<",		1, , , ,1, , , ,1,1, , , , , ,1, , ,1,1)
op(	SHR,	">>",		1, , , ,1, , , ,1,1, , , ,1, ,1, , ,1,1)

/*	name	repr		b l b z i c a s f v - b s l r p c e e =	*/
op(	LT,	"<",		1,1, , , , , ,1,1,1, ,1, ,1,1, ,1,1, ,1)
op(	LE,	"<=",		1,1, , , , , ,1,1,1, ,1, ,1,1, ,1,1, ,1)
op(	GT,	">",		1,1, , , , , ,1,1,1, ,1, ,1,1, ,1,1, ,1)
op(	GE,	">=",		1,1, , , , , ,1,1,1, ,1, ,1,1, ,1,1, ,1)
op(	EQ,	"==",		1,1,1, , , , ,1,1,1, ,1, , , , ,1,1, ,1)
op(	NE,	"!=",		1,1,1, , , , ,1,1,1, ,1, , , , ,1,1, ,1)

/*	name	repr		b l b z i c a s f v - b s l r p c e e =	*/
op(	BITAND,	"&",		1, ,1, ,1, , , ,1,1, ,1, , , ,1, , ,1, )
op(	BITXOR,	"^",		1, ,1, ,1, , , ,1,1, ,1, , , ,1, , ,1, )
op(	BITOR,	"|",		1, ,1, ,1, , , ,1,1, ,1, , , ,1, , ,1, )
op(	LOGAND,	"&&",		1,1,1,1, , , ,1,1, , , , , , , , , ,1, )
op(	LOGOR,	"||",		1,1,1,1, , , ,1,1, , , , , , ,1, , ,1, )
op(	QUEST,	"?",		1, , ,1, , , , ,1, , , , , , , , , , , )
op(	COLON,	":",		1, ,1, , , , , , ,1, ,1, , , , , ,1, , )

/*	name	repr		b l b z i c a s f v - b s l r p c e e =	*/
op(	ASSIGN,	"=",		1, ,1, , , , , , , , , ,1, , , , ,1, , )
op(	MULASS,	"*=",		1, , , , , ,1, , , , , ,1, , , , , ,1, )
op(	DIVASS,	"/=",		1, , , , , ,1, , , , , ,1, ,1, , , ,1, )
op(	MODASS,	"%=",		1, , , ,1, , , , , , , ,1, ,1, , , ,1, )
op(	ADDASS,	"+=",		1, , , , , , ,1, , , , ,1, , , , , ,1, )
op(	SUBASS,	"-=",		1, , , , , , ,1, , , , ,1, , , , , ,1, )
op(	SHLASS,	"<<=",		1, , , ,1, , , , , , , ,1, , , , , ,1, )
op(	SHRASS,	">>=",		1, , , ,1, , , , , , , ,1, , , , , ,1, )
op(	ANDASS,	"&=",		1, ,1, ,1, , , , , , , ,1, , , , , ,1, )
op(	XORASS,	"^=",		1, ,1, ,1, , , , , , , ,1, , , , , ,1, )
op(	ORASS,	"|=",		1, ,1, ,1, , , , , , , ,1, , , , , ,1, )

/*	name	repr		b l b z i c a s f v - b s l r p c e e =	*/
op(	NAME,	"name",		 , , , , , , , , , , , , , , , , , , , )
op(	CON,	"constant",	 , , , , , , , , , , , , , , , , , , , )
op(	STRING,	"string",	 , , , , , , , , , , , , , , , , , , , )
op(	FSEL,	"fsel",		 , , , , , , , , , , , , , , , , , , , )
op(	CALL,	"call",		1, , , , , , , , , , , ,1, , , , , , , )
op(	COMMA,	",",		1, ,1, , , , , , , , , , , , , , , , ,1)
op(	CVT,	"convert",	 , , , , , , , , ,1, , , , , , , , , , )
op(	ICALL,	"icall",	1, , , , , , , , , , , ,1, , , , , , , )
op(	LOAD,	"load",		 , , , , , , , , , , , , , , , , , , , )
/*
 * PUSH is a virtual node that is used to concatenate arguments in a function
 * call expression.  The PUSH nodes are ordered from right to left.  For
 * example, the function call f(17, 23) is represented as
 * CALL(f, PUSH(23, PUSH(17, NULL))).
 */
op(	PUSH,	"push",		 , , , , , , , , ,1, , , , , , , , , , )
op(	RETURN,	"return",	1, ,1, , , , , , , , , ,1, , , , ,1, , )
op(	REAL,	"real",		 , , , , , , , , , , , , , , , , , , , )
op(	IMAG,	"imag",		 , , , , , , , , , , , , , , , , , , , )

/* INIT, CASE and FARG are pseudo operators that don't appear in the tree. */
/*	name	repr		b l b z i c a s f v - b s l r p c e e =	*/
op(	INIT,	"init",		1, ,1, , , , , , , , , ,1, , , , ,1, , )
op(	CASE,	"case",		 , , , , , , , , , , , , , , , , , , , )
/*
 * FARG is only used temporarily in check_prototype_argument to check type
 * compatibility and conversion for function arguments.
 */
op(	FARG,	"farg",		1, ,1, , , , , , , , , , , , , , ,1, , )

end_ops()

#ifndef NOPS
#  define NOPS ((int)FARG + 1)
#endif

#undef begin_ops
#undef op
#undef end_ops
