From 81fc136a16f0b0ebac14e7f339dfbcd6c639d79d Mon Sep 17 00:00:00 2001 From: evans1629 Date: Thu, 12 Dec 2002 19:18:05 +0000 Subject: [PATCH] Added support for +longint and +shortint and associated test case. --- src/Headers/context.h | 2 + src/context.c | 24 +++- src/cprim.c | 314 +++++++++++++++++++++++------------------- src/flags.c | 8 ++ src/flags.def | 16 +++ test/Makefile.am | 15 +- test/longint.c | 14 ++ test/longint.expect | 21 +++ 8 files changed, 265 insertions(+), 149 deletions(-) create mode 100644 test/longint.c create mode 100644 test/longint.expect diff --git a/src/Headers/context.h b/src/Headers/context.h index a69186d..2493d31 100644 --- a/src/Headers/context.h +++ b/src/Headers/context.h @@ -237,6 +237,8 @@ extern void context_quietExitFunction (void); extern bool context_msgBoolInt (void) /*@*/ ; extern bool context_msgCharInt (void) /*@*/ ; extern bool context_msgEnumInt (void) /*@*/ ; +extern bool context_msgLongInt (void) /*@*/ ; +extern bool context_msgShortInt (void) /*@*/ ; extern bool context_msgPointerArith (void) /*@*/ ; extern bool context_msgStrictOps (void) /*@*/ ; diff --git a/src/context.c b/src/context.c index 81d8ada..0b45538 100644 --- a/src/context.c +++ b/src/context.c @@ -1109,7 +1109,7 @@ context_setModeAux (cstring s, bool warn) { flagcode modeflags[] = { - FLG_BOOLINT, FLG_CHARINT, FLG_FLOATDOUBLE, + FLG_BOOLINT, FLG_CHARINT, FLG_FLOATDOUBLE, FLG_LONGINT, FLG_SHORTINT, FLG_ENUMINT, FLG_RELAXQUALS, FLG_FORWARDDECL, FLG_CHARINDEX, FLG_ABSTVOIDP, FLG_USEALLGLOBS, FLG_CHARUNSIGNEDCHAR, @@ -4368,32 +4368,42 @@ context_destroyMod (void) } /* -** Flag shortcuts. +** Flag shortcuts */ bool context_msgBoolInt (void) { - return gc.flags [FLG_BOOLINT]; + return context_flagOn (FLG_BOOLINT, g_currentloc); } bool context_msgCharInt (void) { - return gc.flags [FLG_CHARINT]; + return context_flagOn (FLG_CHARINT, g_currentloc); } bool context_msgEnumInt (void) { - return gc.flags [FLG_ENUMINT]; + return context_flagOn (FLG_ENUMINT, g_currentloc); +} + +bool context_msgLongInt (void) +{ + return context_flagOn (FLG_LONGINT, g_currentloc); +} + +bool context_msgShortInt (void) +{ + return context_flagOn (FLG_SHORTINT, g_currentloc); } bool context_msgPointerArith (void) { - return gc.flags [FLG_POINTERARITH]; + return context_flagOn (FLG_POINTERARITH, g_currentloc); } bool context_msgStrictOps (void) { - return gc.flags [FLG_STRICTOPS]; + return context_flagOn (FLG_STRICTOPS, g_currentloc); } bool context_msgLh (void) diff --git a/src/cprim.c b/src/cprim.c index 9f75119..3f48794 100644 --- a/src/cprim.c +++ b/src/cprim.c @@ -82,6 +82,8 @@ cprim_closeEnoughAux (cprim c1, cprim c2, bool deep) { if (c1 == c2) return TRUE; + DPRINTF (("cprim close: %s / %s", cprim_unparse (c1), cprim_unparse (c2))); + if (c1 == CTX_ANYINTEGRAL) { if (context_getFlag (FLG_MATCHANYINTEGRAL) @@ -203,6 +205,9 @@ cprim_closeEnoughAux (cprim c1, cprim c2, bool deep) } } + + DPRINTF (("cprim close: %s / %s", cprim_unparse (c1), cprim_unparse (c2))); + if (context_getFlag (FLG_RELAXTYPES)) { if (cprim_isNumeric (c1) && cprim_isNumeric (c2)) return TRUE; @@ -214,12 +219,18 @@ cprim_closeEnoughAux (cprim c1, cprim c2, bool deep) { case CTX_CHAR: case CTX_UCHAR: - return (cprim_isAnyChar (c2) - || (cprim_isAnyInt (c2) && (context_msgCharInt ()))); + if (cprim_isAnyChar (c2) + || (cprim_isAnyInt (c2) && (context_msgCharInt ()))) { + return TRUE; + } + break; case CTX_DOUBLE: case CTX_FLOAT: case CTX_LDOUBLE: - return (c2 == CTX_DOUBLE || c2 == CTX_FLOAT || c2 == CTX_LDOUBLE); + if (c2 == CTX_DOUBLE || c2 == CTX_FLOAT || c2 == CTX_LDOUBLE) { + return TRUE; + } + break; case CTX_INT: case CTX_LINT: case CTX_LLINT: @@ -228,156 +239,179 @@ cprim_closeEnoughAux (cprim c1, cprim c2, bool deep) case CTX_UINT: case CTX_ULINT: case CTX_USINT: - return (cprim_isAnyInt (c2) - || (cprim_isAnyChar (c2) && context_msgCharInt ())); + if (cprim_isAnyInt (c2) + || (cprim_isAnyChar (c2) && context_msgCharInt ())) { + return TRUE; + } default: - return FALSE; + ; } } - else + + if (context_getFlag (FLG_IGNORESIGNS)) { - if (context_getFlag (FLG_IGNORESIGNS)) + if (c1 == CTX_UCHAR) { - if (c1 == CTX_UCHAR) - { - c1 = CTX_CHAR; - } - else if (c1 == CTX_UINT) - { - c1 = CTX_INT; - } - else if (c1 == CTX_ULINT) - { - c1 = CTX_LINT; - } - /* 2001-06-10: This fix provided by Jim Zelenka: */ - else if (c1 == CTX_ULLINT) - { - c1 = CTX_LLINT; - } - /* End fix */ - else if (c1 == CTX_USINT) - { - c1 = CTX_SINT; - } - else - { - ; - } - - if (c2 == CTX_UCHAR) - { - c2 = CTX_CHAR; - } - else if (c2 == CTX_UINT) - { - c2 = CTX_INT; - } - else if (c2 == CTX_ULINT) - { - c2 = CTX_LINT; - } - /* 2001-06-10: This fix provided by Jim Zelenka: */ - else if (c2 == CTX_ULLINT) - { - c2 = CTX_LLINT; - } - /* End fix */ - else if (c2 == CTX_USINT) - { - c2 = CTX_SINT; - } - else - { - ; - } + c1 = CTX_CHAR; } - - if (c1 == c2) return TRUE; - - if (context_getFlag (FLG_FLOATDOUBLE)) + else if (c1 == CTX_UINT) { - if (c1 == CTX_FLOAT && c2 == CTX_DOUBLE) - { - return TRUE; - } - if (c2 == CTX_FLOAT && c1 == CTX_DOUBLE) - { - return TRUE; - } + c1 = CTX_INT; + } + else if (c1 == CTX_ULINT) + { + c1 = CTX_LINT; + } + /* 2001-06-10: This fix provided by Jim Zelenka: */ + else if (c1 == CTX_ULLINT) + { + c1 = CTX_LLINT; + } + /* End fix */ + else if (c1 == CTX_USINT) + { + c1 = CTX_SINT; + } + else + { + ; + } + + if (c2 == CTX_UCHAR) + { + c2 = CTX_CHAR; + } + else if (c2 == CTX_UINT) + { + c2 = CTX_INT; + } + else if (c2 == CTX_ULINT) + { + c2 = CTX_LINT; + } + /* 2001-06-10: This fix provided by Jim Zelenka: */ + else if (c2 == CTX_ULLINT) + { + c2 = CTX_LLINT; + } + /* End fix */ + else if (c2 == CTX_USINT) + { + c2 = CTX_SINT; } + else + { + ; + } + } - if (!deep && context_getFlag (FLG_RELAXQUALS)) + if (c1 == c2) return TRUE; + + if (context_getFlag (FLG_FLOATDOUBLE)) + { + if (c1 == CTX_FLOAT && c2 == CTX_DOUBLE) { - switch (c1) - { - case CTX_DOUBLE: - return (c2 == CTX_FLOAT); - case CTX_LDOUBLE: - return (c2 == CTX_DOUBLE || c2 == CTX_FLOAT); - case CTX_SINT: - return (c2 == CTX_CHAR && context_msgCharInt ()); - case CTX_INT: - return (c2 == CTX_SINT - || (cprim_isAnyChar (c2) && context_msgCharInt ())); - case CTX_LLINT: - return (c2 == CTX_SINT - || c2 == CTX_INT + return TRUE; + } + if (c2 == CTX_FLOAT && c1 == CTX_DOUBLE) + { + return TRUE; + } + } + + DPRINTF (("cprim close: %s / %s", cprim_unparse (c1), cprim_unparse (c2))); + + if (!deep && context_getFlag (FLG_RELAXQUALS)) + { + switch (c1) + { + case CTX_DOUBLE: + return (c2 == CTX_FLOAT); + case CTX_LDOUBLE: + return (c2 == CTX_DOUBLE || c2 == CTX_FLOAT); + case CTX_SINT: + return ((c2 == CTX_CHAR && context_msgCharInt ()) + || (c2 == CTX_INT && context_msgShortInt ()) + || (c2 == CTX_LINT && context_msgShortInt () && context_msgLongInt ())); + + case CTX_INT: + return ((c2 == CTX_SINT + || (cprim_isAnyChar (c2) && context_msgCharInt ()) + || (c2 == CTX_LINT && context_msgLongInt ()))); + + case CTX_LLINT: + return (c2 == CTX_SINT + || c2 == CTX_INT || c2 == CTX_LINT - || (cprim_isAnyChar (c2) && context_msgCharInt ())); - case CTX_ULLINT: - return (c2 == CTX_USINT - || c2 == CTX_UINT - || c2 == CTX_ULINT - /* 2001-06-10: This fix provided by Jim Zelenka: */ - || (cprim_isAnyChar (c2) && context_msgCharInt ())); - case CTX_LINT: - return (c2 == CTX_SINT - || c2 == CTX_INT - || (cprim_isAnyChar (c2) && context_msgCharInt ())); - case CTX_UINT: - return (c2 == CTX_USINT - || (c2 == CTX_UCHAR && context_msgCharInt ())); - case CTX_USINT: - return (c2 == CTX_UCHAR && context_msgCharInt ()); - case CTX_ULINT: - /* 2001-06-10: This fix provided by Jim Zelenka: */ - return (c2 == CTX_UINT || c2 == CTX_USINT - || (c2 == CTX_UCHAR && context_msgCharInt())); - case CTX_UCHAR: - return (c2 == CTX_UINT && context_msgCharInt ()); - case CTX_CHAR: - return ((c2 == CTX_INT || c2 == CTX_SINT) - && context_msgCharInt ()); - default: - return FALSE; - } + || (cprim_isAnyChar (c2) && context_msgCharInt ())); + case CTX_ULLINT: + return (c2 == CTX_USINT + || c2 == CTX_UINT + || c2 == CTX_ULINT + /* 2001-06-10: This fix provided by Jim Zelenka: */ + || (cprim_isAnyChar (c2) && context_msgCharInt ())); + case CTX_LINT: + return (c2 == CTX_SINT + || c2 == CTX_INT + || (cprim_isAnyChar (c2) && context_msgCharInt ())); + case CTX_UINT: + return (c2 == CTX_USINT + || (c2 == CTX_UCHAR && context_msgCharInt ())); + case CTX_USINT: + return (c2 == CTX_UCHAR && context_msgCharInt ()); + case CTX_ULINT: + /* 2001-06-10: This fix provided by Jim Zelenka: */ + return (c2 == CTX_UINT || c2 == CTX_USINT + || (c2 == CTX_UCHAR && context_msgCharInt())); + case CTX_UCHAR: + return (c2 == CTX_UINT && context_msgCharInt ()); + case CTX_CHAR: + return ((c2 == CTX_INT || c2 == CTX_SINT) + && context_msgCharInt ()); + default: + return FALSE; } - else + } + else + { + switch (c1) { - switch (c1) - { - case CTX_DOUBLE: - case CTX_LDOUBLE: - return FALSE; - case CTX_SINT: - case CTX_INT: - case CTX_LINT: - case CTX_LLINT: - return (c2 == CTX_CHAR && context_msgCharInt ()); - case CTX_UINT: - case CTX_USINT: - case CTX_ULINT: - case CTX_ULLINT: - return (c2 == CTX_UCHAR && context_msgCharInt ()); - case CTX_UCHAR: - return (c2 == CTX_UINT && context_msgCharInt ()); - case CTX_CHAR: - return ((c2 == CTX_INT || c2 == CTX_SINT) - && context_msgCharInt ()); - default: - return FALSE; - } + case CTX_DOUBLE: + case CTX_LDOUBLE: + return FALSE; + case CTX_SINT: + if (c2 == CTX_INT && context_msgShortInt ()) { + return TRUE; + } + /*@fallthrough@*/ + case CTX_INT: + if (c2 == CTX_INT && context_msgLongInt ()) { + return TRUE; + } + + if (c2 == CTX_SINT && context_msgShortInt ()) { + return TRUE; + } + /*@fallthrough@*/ + case CTX_LINT: + if (c2 == CTX_INT && context_msgLongInt ()) { + return TRUE; + } + /*@fallthrough@*/ + case CTX_LLINT: + return (c2 == CTX_CHAR && context_msgCharInt ()); + case CTX_UINT: + case CTX_USINT: + case CTX_ULINT: + case CTX_ULLINT: + return (c2 == CTX_UCHAR && context_msgCharInt ()); + case CTX_UCHAR: + return (c2 == CTX_UINT && context_msgCharInt ()); + case CTX_CHAR: + return ((c2 == CTX_INT || c2 == CTX_SINT) + && context_msgCharInt ()); + default: + return FALSE; } } } diff --git a/src/flags.c b/src/flags.c index cdc6dc7..4763a50 100644 --- a/src/flags.c +++ b/src/flags.c @@ -1111,6 +1111,14 @@ flags_identifyFlagAux (cstring s, bool quiet) { res = FLG_ENUMINT; } + else if (cstring_equalLit (cflag, "intlong")) + { + res = FLG_LONGINT; + } + else if (cstring_equalLit (cflag, "intshort")) + { + res = FLG_SHORTINT; + } /* ** Backwards compatibility for our American friends... */ diff --git a/src/flags.def b/src/flags.def index 7ecb38d..28976cc 100644 --- a/src/flags.def +++ b/src/flags.def @@ -3692,6 +3692,22 @@ static flaglist flags = "To make enum and int types equivalent, use +enumint.", 0, 0 }, + { + FK_TYPEEQ, FK_NONE, modeFlag, + "longint", + FLG_LONGINT, + "long int and int are equivalent", + "To make long int and int types equivalent, use +longint.", + 0, 0 + }, + { + FK_TYPEEQ, FK_NONE, modeFlag, + "shortint", + FLG_SHORTINT, + "short int and int are equivalent", + "To make short int and int types equivalent, use +shortint.", + 0, 0 + }, { FK_TYPEEQ, FK_NONE, modeFlag, "floatdouble", diff --git a/test/Makefile.am b/test/Makefile.am index af72308..d2daf34 100644 --- a/test/Makefile.am +++ b/test/Makefile.am @@ -45,7 +45,7 @@ UNITTESTS = \ compoundliterals compoundstmt constannot controldepth csyntax czechnames czechoslovaknames deadparam \ decl divzero enum enumtag exports external fields flags forbody format freearray \ funcpointer functionmacro glob globals impabstract info init inparam internal iter keep libs \ - linked lintcomments list loopexec looptesteffect \ + linked lintcomments list longint loopexec looptesteffect \ macros macrosef merge mergenull modifies modtest moduncon \ mongoincludes mystrncat noeffect null observer oldstyle outglob outparam \ parentype postnotnull preds prefixes printflike rc refcounts release repexpose \ @@ -519,6 +519,17 @@ lintcomments: list: -$(SPLINTR) list.c -expect 3 +### +### 2002-12-12: Added test case for +longint and +shortint flags +### + +.PHONY: longint +longint: + -$(SPLINTR) longint.c -expect 3 + -$(SPLINTR) longint.c +longint -expect 2 + -$(SPLINTR) longint.c +shortint -expect 2 + -$(SPLINTR) longint.c +shortint +longint -expect 0 + ### ### 2002-01-01: Added test case for obvious loop execution. ### @@ -1539,7 +1550,7 @@ EXTRA_DIST = ./abst_t.lcl \ unioninit.expect unioninit.c utypes.c \ utypes.expect widestrings.expect widestrings.c \ functionmacro.expect functionmacro.c info.c info.expect \ - loopexec.c looptesteffect.c mergenull.c shifts.c \ + longint.c loopexec.c looptesteffect.c mergenull.c shifts.c \ manual.expect ./manual/Makefile \ ./manual/annotglobs.c ./manual/bool.c ./manual/bool.h ./manual/clauses.c ./manual/employee.h ./manual/exposure.c ./manual/globals.c ./manual/ignore.c ./manual/implicit.c ./manual/intSet.h ./manual/list.c ./manual/loop.c ./manual/macros.c ./manual/modify.c ./manual/mstring.c ./manual/mstring.h ./manual/mstringnn.c ./manual/multiError.c ./manual/names.c ./manual/noeffect.c ./manual/null.c ./manual/only.c ./manual/order.c ./manual/palindrome.c ./manual/palindrome.h ./manual/refs.c ./manual/returned.c ./manual/rgb.c ./manual/rstring.c ./manual/rstring.h ./manual/sample.c ./manual/setChar.c ./manual/setname.c ./manual/setname.h ./manual/special.c ./manual/stack.c ./manual/sumsquares.c ./manual/switch.c ./manual/testpal.c ./manual/types.c ./manual/unique.c ./manual/usedef.c ./manual/bounds.c \ arraydims.expect arraydims.c \ diff --git a/test/longint.c b/test/longint.c new file mode 100644 index 0000000..c813615 --- /dev/null +++ b/test/longint.c @@ -0,0 +1,14 @@ +void f (void) +{ + long int li1 = 3L; + int i1 = 7; + short int si1 = 3; + + i1 = li1; /* error unless +longint */ + li1 = i1; /* okay */ + i1 = si1; /* okay */ + si1 = i1; /* error unless +shortint */ + + li1 = si1; + si1 = li1; /* error unless +shortint +longint */ +} diff --git a/test/longint.expect b/test/longint.expect new file mode 100644 index 0000000..f3db822 --- /dev/null +++ b/test/longint.expect @@ -0,0 +1,21 @@ + +longint.c: (in function f) +longint.c:7:3: Assignment of long int to int: i1 = li1 +longint.c:10:3: Assignment of int to short int: si1 = i1 +longint.c:13:3: Assignment of long int to short int: si1 = li1 + +Finished checking --- 3 code warnings, as expected + +longint.c: (in function f) +longint.c:10:3: Assignment of int to short int: si1 = i1 +longint.c:13:3: Assignment of long int to short int: si1 = li1 + +Finished checking --- 2 code warnings, as expected + +longint.c: (in function f) +longint.c:7:3: Assignment of long int to int: i1 = li1 +longint.c:13:3: Assignment of long int to short int: si1 = li1 + +Finished checking --- 2 code warnings, as expected + +Finished checking --- no warnings -- 2.45.2