]> andersk Git - splint.git/commitdiff
Added support for +longint and +shortint and associated test case.
authorevans1629 <evans1629>
Thu, 12 Dec 2002 19:18:05 +0000 (19:18 +0000)
committerevans1629 <evans1629>
Thu, 12 Dec 2002 19:18:05 +0000 (19:18 +0000)
src/Headers/context.h
src/context.c
src/cprim.c
src/flags.c
src/flags.def
test/Makefile.am
test/longint.c [new file with mode: 0644]
test/longint.expect [new file with mode: 0644]

index a69186db5cf6a26048d9ed063ac59eff7614b01a..2493d3121c62ac15e36b2c444e8d7e4cf8220d11 100644 (file)
@@ -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) /*@*/ ;
 
index 81d8adaabc64a87571ec4bac7d324fe03343f2ac..0b455382a298bd897bf724000bb971cb57fd3922 100644 (file)
@@ -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)           
index 9f751193c05e66d892f55ce240f5f6f5fd097b75..3f4879421c7eb8f4cd1bb17b1a91c46cc022f989 100644 (file)
@@ -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;
        }
     }
 }
index cdc6dc78868a32feb1490f652a139329d4db6ac8..4763a50a9e9499348612f5a19074b759ee89d192 100644 (file)
@@ -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...
       */
index 7ecb38dca167cbd29c1e4bbc71b344d081da9fce..28976cc523f9d0470570c3ebf09073d51d551f1a 100644 (file)
@@ -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",
index af72308cfdf41c5f4c4a9ac89f0a114cf61c663d..d2daf3403352d98f32399e0b9493fcb3486cdc02 100644 (file)
@@ -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 (file)
index 0000000..c813615
--- /dev/null
@@ -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 (file)
index 0000000..f3db822
--- /dev/null
@@ -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
This page took 0.146364 seconds and 5 git commands to generate.