]> granicus.if.org Git - nethack/commitdiff
re-enable -Wunreachable-code under clang
authornhmall <nhmall@nethack.org>
Fri, 22 Oct 2021 16:27:10 +0000 (12:27 -0400)
committernhmall <nhmall@nethack.org>
Fri, 22 Oct 2021 16:27:10 +0000 (12:27 -0400)
whitelist the valid cases showing up

If an earlier version of clang is showing more cases (particularly
if they don't make sense), the re-enabling of the warning in
sys/unix/hints/include/compiler.2020 can be made clang-version
specific instead. I had no way to test earlier versions.

include/warnings.h
src/do_name.c
src/files.c
src/mthrowu.c
src/nhlua.c
src/sp_lev.c
sys/unix/hints/include/compiler.2020
util/panic.c

index 28da4d10805358bdf6796da902e1e75540a2b410..d0971893ce92a5944a8a631386f844ad8fea2fd6 100644 (file)
@@ -50,6 +50,7 @@
 #define DISABLE_WARNING_CONDEXPR_IS_CONSTANT
 #define RESTORE_WARNING_CONDEXPR_IS_CONSTANT
 #define RESTORE_WARNING_FORMAT_NONLITERAL _Pragma("clang diagnostic pop")
+#define RESTORE_WARNING_UNREACHABLE_CODE _Pragma("clang diagnostic pop")
 #define RESTORE_WARNINGS _Pragma("clang diagnostic pop")
 #define STDC_Pragma_AVAILABLE
 
@@ -64,6 +65,7 @@
 #define DISABLE_WARNING_CONDEXPR_IS_CONSTANT
 #define RESTORE_WARNING_CONDEXPR_IS_CONSTANT
 #define RESTORE_WARNING_FORMAT_NONLITERAL _Pragma("GCC diagnostic pop")
+#define RESTORE_WARNING_UNREACHABLE_CODE _Pragma("GCC diagnostic pop")
 #define RESTORE_WARNINGS _Pragma("GCC diagnostic pop")
 #define STDC_Pragma_AVAILABLE
 
@@ -80,6 +82,7 @@
                            _Pragma("warning( disable : 4127 )")
 #define RESTORE_WARNING_CONDEXPR_IS_CONSTANT _Pragma("warning( pop )")
 #define RESTORE_WARNING_FORMAT_NONLITERAL _Pragma("warning( pop )")
+#define RESTORE_WARNING_UNREACHABLE_CODE _Pragma("warning( pop )")
 #define RESTORE_WARNINGS _Pragma("warning( pop )")
 #define STDC_Pragma_AVAILABLE
 #else  /* Visual Studio prior to 2019 below */
@@ -94,6 +97,7 @@
                            __pragma(warning(disable:4127))
 #define RESTORE_WARNING_CONDEXPR_IS_CONSTANT __pragma(warning(pop))
 #define RESTORE_WARNING_FORMAT_NONLITERAL __pragma(warning(pop))
+#define RESTORE_WARNING_UNREACHABLE_CODE __pragma(warning(pop))
 #define RESTORE_WARNINGS  __pragma(warning(pop))
 #define STDC_Pragma_AVAILABLE
 #endif /* vs2019 or vs2017 */
 #define DISABLE_WARNING_CONDEXPR_IS_CONSTANT
 #define RESTORE_WARNING_CONDEXPR_IS_CONSTANT
 #define RESTORE_WARNING_FORMAT_NONLITERAL
+#define RESTORE_WARNING_UNREACHABLE_CODE
 #define RESTORE_WARNINGS
 #endif
 
index 818fa41b85dee499e0ca16e5e8448ffae2952cf6..029938c842cd662aa00e529b4c2f66affd8854d7 100644 (file)
@@ -530,11 +530,14 @@ coord_desc(int x, int y, char *outbuf, char cmode)
         /* for normal map sizes, force a fixed-width formatting so that
            /m, /M, /o, and /O output lines up cleanly; map sizes bigger
            than Nx999 or 999xM will still work, but not line up like normal
-           when displayed in a column setting */
+           when displayed in a column setting.
+
+          The (100) is placed in brackets below to mark the [: "03"] as
+           explicit compile-time dead code for clang */
         if (!*screen_fmt)
             Sprintf(screen_fmt, "[%%%sd,%%%sd]",
-                    (ROWNO - 1 + 2 < 100) ? "02" :  "03",
-                    (COLNO - 1 < 100) ? "02" : "03");
+                    (ROWNO - 1 + 2 < (100)) ? "02" :  "03",
+                    (COLNO - 1 < (100)) ? "02" : "03");
         /* map line 0 is screen row 2;
            map column 0 isn't used, map column 1 is screen column 1 */
         Sprintf(outbuf, screen_fmt, y + 2, x);
index 615f7a661bacae46ef927f2463ac989a20dede61..fe33836e1f0df1547fa88a84151c97b1948db63f 100644 (file)
@@ -923,7 +923,10 @@ set_savefile_name(boolean regularize_it)
             overflow = 2;
     }
 #ifdef SAVE_EXTENSION
-    if (strlen(SAVE_EXTENSION) > 0 && !overflow) {
+    /* (0) is placed in brackets below so that the [&& !overflow] is
+       explicit dead code (the ">" comparison is detected as always
+       FALSE at compile-time). Done to appease clang's -Wunreachable-code */
+    if (strlen(SAVE_EXTENSION) > (0) && !overflow) {
         if (strlen(g.SAVEF) + strlen(SAVE_EXTENSION) < (SAVESIZE - 1)) {
             Strcat(g.SAVEF, SAVE_EXTENSION);
 #ifdef MSDOS
index 89bf4f35062883e3a1565511d5cd7f0eaa2f5766..3644ebf0dc6c4dfe7fec9e3e6a993948087cd587 100644 (file)
@@ -579,10 +579,9 @@ m_throw(
                 potionhit(&g.youmonst, singleobj, POTHIT_MONST_THROW);
                 break;
             }
-
             oldumort = u.umortality;
+
             switch (singleobj->otyp) {
-                int dam, hitv;
             case EGG:
                 if (!touch_petrifies(&mons[singleobj->corpsenm])) {
                     impossible("monster throwing egg type %d",
@@ -596,24 +595,28 @@ m_throw(
                 hitu = thitu(8, 0, &singleobj, (char *) 0);
                 break;
             default:
-                dam = dmgval(singleobj, &g.youmonst);
-                hitv = 3 - distmin(u.ux, u.uy, mon->mx, mon->my);
-                if (hitv < -4)
-                    hitv = -4;
-                if (is_elf(mon->data)
-                    && objects[singleobj->otyp].oc_skill == P_BOW) {
-                    hitv++;
-                    if (MON_WEP(mon) && MON_WEP(mon)->otyp == ELVEN_BOW)
+                {
+                    int dam, hitv;
+
+                    dam = dmgval(singleobj, &g.youmonst);
+                    hitv = 3 - distmin(u.ux, u.uy, mon->mx, mon->my);
+                    if (hitv < -4)
+                        hitv = -4;
+                    if (is_elf(mon->data)
+                        && objects[singleobj->otyp].oc_skill == P_BOW) {
+                        hitv++;
+                        if (MON_WEP(mon) && MON_WEP(mon)->otyp == ELVEN_BOW)
+                            hitv++;
+                        if (singleobj->otyp == ELVEN_ARROW)
+                            dam++;
+                    }
+                    if (bigmonst(g.youmonst.data))
                         hitv++;
-                    if (singleobj->otyp == ELVEN_ARROW)
-                        dam++;
+                    hitv += 8 + singleobj->spe;
+                    if (dam < 1)
+                        dam = 1;
+                    hitu = thitu(hitv, dam, &singleobj, (char *) 0);
                 }
-                if (bigmonst(g.youmonst.data))
-                    hitv++;
-                hitv += 8 + singleobj->spe;
-                if (dam < 1)
-                    dam = 1;
-                hitu = thitu(hitv, dam, &singleobj, (char *) 0);
             }
             if (hitu && singleobj->opoisoned && is_poisonable(singleobj)) {
                 char onmbuf[BUFSZ], knmbuf[BUFSZ];
index db4deb6c49e6fa46fb8bb129c16774cb5fe5a8bf..4f1787a5f13b7fb19c7a97c0eba438b9abe553ff 100644 (file)
@@ -116,6 +116,8 @@ l_nhcore_call(int callidx)
     }
 }
 
+DISABLE_WARNING_UNREACHABLE_CODE
+
 void
 nhl_error(lua_State *L, const char *msg)
 {
@@ -136,8 +138,11 @@ nhl_error(lua_State *L, const char *msg)
 #endif
     (void) lua_error(L);
     /*NOTREACHED*/
+    /* UNREACHABLE_CODE */
 }
 
+RESTORE_WARNING_UNREACHABLE_CODE
+
 /* Check that parameters are nothing but single table,
    or if no parameters given, put empty table there */
 void
index d02e74a1f430d0fd7dd2fdb229b1057d43fdfdc8..4117305c861176c596ba92e242a1861e9b442b84 100644 (file)
@@ -1570,6 +1570,8 @@ create_subroom(
     return TRUE;
 }
 
+DISABLE_WARNING_UNREACHABLE_CODE
+
 /*
  * Create a new door in a room.
  * It's placed on a wall (north, south, east or west).
@@ -1659,6 +1661,7 @@ create_door(room_door* dd, struct mkroom* broom)
         default:
             x = y = 0;
             panic("create_door: No wall for door!");
+            /*UNREACHABLE_CODE*/
             goto outdirloop;
         }
  outdirloop:
@@ -1675,6 +1678,8 @@ create_door(room_door* dd, struct mkroom* broom)
     levl[x][y].doormask = dd->mask;
 }
 
+RESTORE_WARNING_UNREACHABLE_CODE
+
 /*
  * Create a secret door in croom on any one of the specified walls.
  */
index 4ba1e9b319ccaddc036f0d5d1342871aa9281744..044b7faf230d9f0c5d1c10bff86e77798f6c24f0 100755 (executable)
@@ -32,10 +32,7 @@ CFLAGS+=-Wall -Wextra -Wno-missing-field-initializers \
 CFLAGS+=-pedantic
 CFLAGS+=-Wmissing-declarations
 CFLAGS+=-Wformat-nonliteral
-# As of LLVM build 2336.1.00, this gives dozens of spurious messages, so
-# # leave it out by default.
-# #CFLAGS+=-Wunreachable-code
-# #
+CFLAGS+=-Wunreachable-code
 #
 # the following are not allowed in C++
 CFLAGS+=-Wimplicit
index d598e03780b24652a5757d12ce965a0c902d462a..d15bec88c0b220f7d477b7a96f1c9be5acf186f2 100644 (file)
@@ -23,6 +23,7 @@ boolean panicking;
 void panic(const char *, ...);
 
 DISABLE_WARNING_FORMAT_NONLITERAL
+DISABLE_WARNING_UNREACHABLE_CODE
 
 void panic
 VA_DECL(const char *, str)
@@ -45,9 +46,11 @@ VA_DECL(const char *, str)
         abort(); /* generate core dump */
 #endif
     VA_END();
+    /* UNREACHABLE_CODE */
     exit(EXIT_FAILURE); /* redundant */
 }
 
+RESTORE_WARNING_UNREACHABLE_CODE
 RESTORE_WARNING_FORMAT_NONLITERAL
 
 #ifdef ALLOCA_HACK