xref: /netbsd-src/usr.bin/xlint/lint1/oper.c (revision 05808a22305ee0287342596791509727b78ddc62)
1*05808a22Srillig /*	$NetBSD: oper.c,v 1.16 2024/03/31 20:28:45 rillig Exp $	*/
286686911Srillig 
386686911Srillig /*-
486686911Srillig  * Copyright (c) 2021 The NetBSD Foundation, Inc.
586686911Srillig  * All rights reserved.
686686911Srillig  *
786686911Srillig  * This code is derived from software contributed to The NetBSD Foundation
886686911Srillig  * by Roland Illig.
986686911Srillig  *
1086686911Srillig  * Redistribution and use in source and binary forms, with or without
1186686911Srillig  * modification, are permitted provided that the following conditions
1286686911Srillig  * are met:
1386686911Srillig  * 1. Redistributions of source code must retain the above copyright
1486686911Srillig  *    notice, this list of conditions and the following disclaimer.
1586686911Srillig  * 2. Redistributions in binary form must reproduce the above copyright
1686686911Srillig  *    notice, this list of conditions and the following disclaimer in the
1786686911Srillig  *    documentation and/or other materials provided with the distribution.
1886686911Srillig  *
1986686911Srillig  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
2086686911Srillig  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
2186686911Srillig  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
2286686911Srillig  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
2386686911Srillig  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
2486686911Srillig  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
2586686911Srillig  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
2686686911Srillig  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
2786686911Srillig  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
2886686911Srillig  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
2986686911Srillig  * POSSIBILITY OF SUCH DAMAGE.
3086686911Srillig  */
3186686911Srillig 
3286686911Srillig #include "op.h"
3386686911Srillig #include "param.h"
3486686911Srillig 
354451bd67Srillig #define X true
364451bd67Srillig #define _ false
374451bd67Srillig 
384451bd67Srillig const mod_t modtab[NOPS] = {
394451bd67Srillig 
404451bd67Srillig /*-
414451bd67Srillig  * Operator properties:
424451bd67Srillig  *
434451bd67Srillig  *	 b   binary
444451bd67Srillig  *	   l   logical
454451bd67Srillig  *	     b   takes _Bool
464451bd67Srillig  *	       z   compares with zero
474451bd67Srillig  *		 i   requires integer
484451bd67Srillig  *		   c   requires integer or complex
494451bd67Srillig  *		     a   requires arithmetic
504451bd67Srillig  *		       s   requires scalar
514451bd67Srillig  *			 f   fold constant operands
524451bd67Srillig  *			   v   value context
534451bd67Srillig  *			     b   balance operands
544451bd67Srillig  *			       s   has side effects
554451bd67Srillig  *				 l   warn if left operand unsigned
564451bd67Srillig  *				   r   warn if right operand unsigned
574451bd67Srillig  *				     p   possible precedence confusion
584451bd67Srillig  *				       c   comparison
594451bd67Srillig  *					 e   valid on enum
604451bd67Srillig  *					   e   bad on enum
614451bd67Srillig  *					     =   warn if operand '='
624451bd67Srillig  *					       o   has operands
634451bd67Srillig  */
644451bd67Srillig 
654451bd67Srillig /*	 b l b z i c a s f v b s l r p c e e = o */
664451bd67Srillig 	{_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, "no-op" },
674451bd67Srillig 	{X,_,X,_,_,_,_,_,_,X,_,_,_,_,_,_,_,_,_,X, "->" },
684451bd67Srillig 	{X,_,X,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,X, "." },
694451bd67Srillig 	{_,X,X,X,_,_,_,X,X,_,_,_,_,_,_,_,_,X,_,X, "!" },
704451bd67Srillig 	{_,_,_,_,_,X,_,_,X,X,_,_,_,_,_,_,_,X,X,X, "~" },
714451bd67Srillig 	/*
724451bd67Srillig 	 * The '++' and '--' operators are conceptually unary operators, but
734451bd67Srillig 	 * lint implements them as binary operators due to the pre-multiplied
744451bd67Srillig 	 * pointer arithmetics, see build_prepost_incdec and build_plus_minus.
754451bd67Srillig 	 */
764451bd67Srillig 	{_,_,_,_,_,_,_,X,_,_,_,X,_,_,_,_,_,X,_,X, "++x" },
774451bd67Srillig 	{_,_,_,_,_,_,_,X,_,_,_,X,_,_,_,_,_,X,_,X, "--x" },
784451bd67Srillig 	{_,_,_,_,_,_,_,X,_,_,_,X,_,_,_,_,_,X,_,X, "x++" },
794451bd67Srillig 	{_,_,_,_,_,_,_,X,_,_,_,X,_,_,_,_,_,X,_,X, "x--" },
804451bd67Srillig 	{_,_,_,_,_,_,X,_,X,X,_,_,_,_,_,_,_,X,X,X, "+" },
814451bd67Srillig 	{_,_,_,_,_,_,X,_,X,X,_,_,X,_,_,_,_,X,X,X, "-" },
824451bd67Srillig 	{_,_,_,_,_,_,_,_,_,X,_,_,_,_,_,_,_,_,_,X, "*" },
834451bd67Srillig 	{_,_,X,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,X, "&" },
844451bd67Srillig /*	 b l b z i c a s f v b s l r p c e e = o */
854451bd67Srillig 	{X,_,_,_,_,_,X,_,X,X,X,_,_,X,_,_,_,X,X,X, "*" },
864451bd67Srillig 	{X,_,_,_,_,_,X,_,X,X,X,_,X,X,_,_,_,X,X,X, "/" },
874451bd67Srillig 	{X,_,_,_,X,_,_,_,X,X,X,_,X,X,_,_,_,X,X,X, "%" },
884451bd67Srillig 	{X,_,_,_,_,_,_,X,X,X,X,_,_,_,_,_,_,X,_,X, "+" },
894451bd67Srillig 	{X,_,_,_,_,_,_,X,X,X,X,_,_,_,_,_,_,X,_,X, "-" },
904451bd67Srillig 	{X,_,_,_,X,_,_,_,X,X,_,_,_,_,X,_,_,X,X,X, "<<" },
914451bd67Srillig 	{X,_,_,_,X,_,_,_,X,X,_,_,X,_,X,_,_,X,X,X, ">>" },
924451bd67Srillig /*	 b l b z i c a s f v b s l r p c e e = o */
934451bd67Srillig 	{X,X,_,_,_,_,_,X,X,X,X,_,X,X,_,X,X,_,X,X, "<" },
944451bd67Srillig 	{X,X,_,_,_,_,_,X,X,X,X,_,X,X,_,X,X,_,X,X, "<=" },
954451bd67Srillig 	{X,X,_,_,_,_,_,X,X,X,X,_,X,X,_,X,X,_,X,X, ">" },
964451bd67Srillig 	{X,X,_,_,_,_,_,X,X,X,X,_,X,X,_,X,X,_,X,X, ">=" },
974451bd67Srillig 	{X,X,X,_,_,_,_,X,X,X,X,_,_,_,_,X,X,_,X,X, "==" },
984451bd67Srillig 	{X,X,X,_,_,_,_,X,X,X,X,_,_,_,_,X,X,_,X,X, "!=" },
994451bd67Srillig /*	 b l b z i c a s f v b s l r p c e e = o */
1004451bd67Srillig 	{X,_,X,_,X,_,_,_,X,X,X,_,_,_,X,_,_,X,_,X, "&" },
1014451bd67Srillig 	{X,_,X,_,X,_,_,_,X,X,X,_,_,_,X,_,_,X,_,X, "^" },
1024451bd67Srillig 	{X,_,X,_,X,_,_,_,X,X,X,_,_,_,X,_,_,X,_,X, "|" },
1034451bd67Srillig 	{X,X,X,X,_,_,_,X,X,_,_,_,_,_,_,_,_,X,_,X, "&&" },
1044451bd67Srillig 	{X,X,X,X,_,_,_,X,X,_,_,_,_,_,X,_,_,X,_,X, "||" },
1054451bd67Srillig 	{X,_,_,X,_,_,_,_,X,_,_,_,_,_,_,_,_,_,_,X, "?" },
1064451bd67Srillig 	{X,_,X,_,_,_,_,_,_,X,X,_,_,_,_,_,X,_,_,X, ":" },
1074451bd67Srillig /*	 b l b z i c a s f v b s l r p c e e = o */
1084451bd67Srillig 	{X,_,X,_,_,_,_,_,_,_,_,X,_,_,_,_,X,_,_,X, "=" },
1094451bd67Srillig 	{X,_,_,_,_,_,X,_,_,_,_,X,_,_,_,_,_,X,_,X, "*=" },
1104451bd67Srillig 	{X,_,_,_,_,_,X,_,_,_,_,X,_,X,_,_,_,X,_,X, "/=" },
1114451bd67Srillig 	{X,_,_,_,X,_,_,_,_,_,_,X,_,X,_,_,_,X,_,X, "%=" },
1124451bd67Srillig 	{X,_,_,_,_,_,_,X,_,_,_,X,_,_,_,_,_,X,_,X, "+=" },
1134451bd67Srillig 	{X,_,_,_,_,_,_,X,_,_,_,X,_,_,_,_,_,X,_,X, "-=" },
1144451bd67Srillig 	{X,_,_,_,X,_,_,_,_,_,_,X,_,_,_,_,_,X,_,X, "<<=" },
1154451bd67Srillig 	{X,_,_,_,X,_,_,_,_,_,_,X,_,_,_,_,_,X,_,X, ">>=" },
1164451bd67Srillig 	{X,_,X,_,X,_,_,_,_,_,_,X,_,_,_,_,_,X,_,X, "&=" },
1174451bd67Srillig 	{X,_,X,_,X,_,_,_,_,_,_,X,_,_,_,_,_,X,_,X, "^=" },
1184451bd67Srillig 	{X,_,X,_,X,_,_,_,_,_,_,X,_,_,_,_,_,X,_,X, "|=" },
1194451bd67Srillig /*	 b l b z i c a s f v b s l r p c e e = o */
1204451bd67Srillig 	{_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, "name" },
1214451bd67Srillig 	{_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, "constant" },
1224451bd67Srillig 	{_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, "string" },
1234451bd67Srillig 	{_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,X, "fsel" },
1245c34ad8fSrillig 	{_,_,_,_,_,_,_,_,_,_,_,X,_,_,_,_,_,_,_,_, "call" },
1254451bd67Srillig 	{X,_,X,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,X,X, "," },
1264451bd67Srillig 	{_,_,_,_,_,_,_,_,_,X,_,_,_,_,_,_,_,_,_,X, "convert" },
1274451bd67Srillig 	{_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,X, "load" },
1284451bd67Srillig 	{X,_,X,_,_,_,_,_,_,_,_,X,_,_,_,_,X,_,_,X, "return" },
1294451bd67Srillig 	{_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,X, "real" },
1304451bd67Srillig 	{_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,X, "imag" },
1314451bd67Srillig 	{X,_,X,_,_,_,_,_,_,_,_,X,_,_,_,_,X,_,_,X, "init" },
1324451bd67Srillig 	{_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, "case" },
1334451bd67Srillig 	{X,_,X,_,_,_,_,_,_,_,_,_,_,_,_,_,X,_,_,X, "farg" },
1344451bd67Srillig };
135