Changeset: 0ac451062fdb for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/0ac451062fdb Modified Files: gdk/gdk.h gdk/gdk_atoms.h gdk/gdk_bat.c gdk/gdk_batop.c gdk/gdk_cand.h gdk/gdk_group.c gdk/gdk_hash.h gdk/gdk_storage.c gdk/gdk_system.h Branch: default Log Message:
Tell the compiler certain code paths are unreachable. diffs (285 lines): diff --git a/gdk/gdk.h b/gdk/gdk.h --- a/gdk/gdk.h +++ b/gdk/gdk.h @@ -1626,10 +1626,6 @@ gdk_export gdk_return GDKtracer_fill_com gdk_export _Noreturn void GDKfatal(_In_z_ _Printf_format_string_ const char *format, ...) __attribute__((__format__(__printf__, 1, 2))); - /* -gdk_export void GDKfatal(_In_z_ _Printf_format_string_ const char *format, ...) - __attribute__((__format__(__printf__, 1, 2))); - */ gdk_export void GDKclrerr(void); @@ -1675,6 +1671,8 @@ tfastins_nocheckVAR(BAT *b, BUN p, const ((uint64_t *) b->theap->base)[p] = (uint64_t) d; break; #endif + default: + MT_UNREACHABLE(); } return GDK_SUCCEED; } diff --git a/gdk/gdk_atoms.h b/gdk/gdk_atoms.h --- a/gdk/gdk_atoms.h +++ b/gdk/gdk_atoms.h @@ -437,12 +437,14 @@ VarHeapVal(const void *b, BUN p, int w) return (size_t) ((const uint8_t *) b)[p] + GDK_VAROFFSET; case 2: return (size_t) ((const uint16_t *) b)[p] + GDK_VAROFFSET; -#if SIZEOF_VAR_T == 8 case 4: return (size_t) ((const uint32_t *) b)[p]; +#if SIZEOF_VAR_T == 8 + case 8: + return (size_t) ((const uint64_t *) b)[p]; #endif default: - return (size_t) ((const var_t *) b)[p]; + MT_UNREACHABLE(); } } diff --git a/gdk/gdk_bat.c b/gdk/gdk_bat.c --- a/gdk/gdk_bat.c +++ b/gdk/gdk_bat.c @@ -1511,7 +1511,7 @@ BUNinplacemulti(BAT *b, const oid *posit ptr _ptr; _ptr = BUNtloc(bi, p); switch (b->twidth) { - default: /* only three or four cases possible */ + case 1: _d = (var_t) * (uint8_t *) _ptr + GDK_VAROFFSET; break; case 2: @@ -1525,6 +1525,8 @@ BUNinplacemulti(BAT *b, const oid *posit _d = (var_t) * (uint64_t *) _ptr; break; #endif + default: + MT_UNREACHABLE(); } if (ATOMreplaceVAR(b, &_d, t) != GDK_SUCCEED) { MT_rwlock_wrunlock(&b->thashlock); @@ -1549,7 +1551,7 @@ BUNinplacemulti(BAT *b, const oid *posit } _ptr = BUNtloc(bi, p); switch (b->twidth) { - default: /* only three or four cases possible */ + case 1: * (uint8_t *) _ptr = (uint8_t) (_d - GDK_VAROFFSET); break; case 2: @@ -1563,6 +1565,8 @@ BUNinplacemulti(BAT *b, const oid *posit * (uint64_t *) _ptr = (uint64_t) _d; break; #endif + default: + MT_UNREACHABLE(); } } else if (ATOMstorage(b->ttype) == TYPE_msk) { mskSetVal(b, p, * (msk *) t); diff --git a/gdk/gdk_batop.c b/gdk/gdk_batop.c --- a/gdk/gdk_batop.c +++ b/gdk/gdk_batop.c @@ -211,7 +211,7 @@ insert_string_bat(BAT *b, BAT *n, struct break; #endif default: - assert(0); + MT_UNREACHABLE(); } MT_thread_setalgorithm("copy offset values"); r = b->batCount; @@ -1239,7 +1239,7 @@ BATappend_or_update(BAT *b, BAT *p, cons var_t d; switch (b->twidth) { - default: /* only three or four cases possible */ + case 1: d = (var_t) ((uint8_t *) b->theap->base)[updid] + GDK_VAROFFSET; break; case 2: @@ -1253,6 +1253,8 @@ BATappend_or_update(BAT *b, BAT *p, cons d = (var_t) ((uint64_t *) b->theap->base)[updid]; break; #endif + default: + MT_UNREACHABLE(); } if (ATOMreplaceVAR(b, &d, new) != GDK_SUCCEED) { goto bailout; @@ -1290,6 +1292,8 @@ BATappend_or_update(BAT *b, BAT *p, cons ((uint64_t *) b->theap->base)[updid] = (uint64_t) d; break; #endif + default: + MT_UNREACHABLE(); } HASHinsert_locked(b, updid, new); @@ -2909,16 +2913,16 @@ BATcount_no_nil(BAT *b, BAT *s) switch (bi.width) { case 1: for (i = 0; i < n; i++) - cnt += base[(var_t) ((const unsigned char *) p)[canditer_next(&ci) - hseq] + GDK_VAROFFSET] != '\200'; + cnt += base[(var_t) ((const uint8_t *) p)[canditer_next(&ci) - hseq] + GDK_VAROFFSET] != '\200'; break; case 2: for (i = 0; i < n; i++) - cnt += base[(var_t) ((const unsigned short *) p)[canditer_next(&ci) - hseq] + GDK_VAROFFSET] != '\200'; + cnt += base[(var_t) ((const uint16_t *) p)[canditer_next(&ci) - hseq] + GDK_VAROFFSET] != '\200'; break; #if SIZEOF_VAR_T != SIZEOF_INT case 4: for (i = 0; i < n; i++) - cnt += base[(var_t) ((const unsigned int *) p)[canditer_next(&ci) - hseq]] != '\200'; + cnt += base[(var_t) ((const uint32_t *) p)[canditer_next(&ci) - hseq]] != '\200'; break; #endif default: diff --git a/gdk/gdk_cand.h b/gdk/gdk_cand.h --- a/gdk/gdk_cand.h +++ b/gdk/gdk_cand.h @@ -163,12 +163,10 @@ canditer_next(struct canditer *ci) case cand_except: return canditer_next_except(ci); case cand_mask: - /* work around compiler error: control reaches end of - * non-void function */ - break; + return canditer_next_mask(ci); + default: + MT_UNREACHABLE(); } - assert(ci->tpe == cand_mask); - return canditer_next_mask(ci); } #define canditer_search_dense(ci, o, next) ((o) < (ci)->seq ? next ? 0 : BUN_NONE : (o) >= (ci)->seq + (ci)->ncand ? next ? (ci)->ncand : BUN_NONE : (o) - (ci)->seq) diff --git a/gdk/gdk_group.c b/gdk/gdk_group.c --- a/gdk/gdk_group.c +++ b/gdk/gdk_group.c @@ -906,7 +906,7 @@ BATgroup_internal(BAT **groups, BAT **ex break; #endif default: - assert(0); + MT_UNREACHABLE(); } } diff --git a/gdk/gdk_hash.h b/gdk/gdk_hash.h --- a/gdk/gdk_hash.h +++ b/gdk/gdk_hash.h @@ -67,7 +67,7 @@ HASHput(Hash *h, BUN i, BUN v) ((BUN2type *) h->Bckt)[i] = (BUN2type) v; break; #endif - default: /* BUN4 */ + case BUN4: ((BUN4type *) h->Bckt)[i] = (BUN4type) v; break; #ifdef BUN8 @@ -75,6 +75,8 @@ HASHput(Hash *h, BUN i, BUN v) ((BUN8type *) h->Bckt)[i] = (BUN8type) v; break; #endif + default: + MT_UNREACHABLE(); } } @@ -90,7 +92,7 @@ HASHputlink(Hash *h, BUN i, BUN v) ((BUN2type *) h->Link)[i] = (BUN2type) v; break; #endif - default: /* BUN4 */ + case BUN4: assert(v == BUN_NONE || v == BUN4_NONE || v < i); ((BUN4type *) h->Link)[i] = (BUN4type) v; break; @@ -100,6 +102,8 @@ HASHputlink(Hash *h, BUN i, BUN v) ((BUN8type *) h->Link)[i] = (BUN8type) v; break; #endif + default: + MT_UNREACHABLE(); } } @@ -112,7 +116,7 @@ HASHget(const Hash *h, BUN i) i = (BUN) ((BUN2type *) h->Bckt)[i]; return i == BUN2_NONE ? BUN_NONE : i; #endif - default: /* BUN4 */ + case BUN4: i = (BUN) ((BUN4type *) h->Bckt)[i]; return i == BUN4_NONE ? BUN_NONE : i; #ifdef BUN8 @@ -120,6 +124,8 @@ HASHget(const Hash *h, BUN i) i = (BUN) ((BUN8type *) h->Bckt)[i]; return i == BUN8_NONE ? BUN_NONE : i; #endif + default: + MT_UNREACHABLE(); } } @@ -132,7 +138,7 @@ HASHgetlink(const Hash *h, BUN i) i = (BUN) ((BUN2type *) h->Link)[i]; return i == BUN2_NONE ? BUN_NONE : i; #endif - default: /* BUN4 */ + case BUN4: i = (BUN) ((BUN4type *) h->Link)[i]; return i == BUN4_NONE ? BUN_NONE : i; #ifdef BUN8 @@ -140,6 +146,8 @@ HASHgetlink(const Hash *h, BUN i) i = (BUN) ((BUN8type *) h->Link)[i]; return i == BUN8_NONE ? BUN_NONE : i; #endif + default: + MT_UNREACHABLE(); } } diff --git a/gdk/gdk_storage.c b/gdk/gdk_storage.c --- a/gdk/gdk_storage.c +++ b/gdk/gdk_storage.c @@ -777,8 +777,10 @@ gettailnamebi(const BATiter *bi) case 4: return "tail4"; #endif + case 8: + return "tail"; default: - return "tail"; + MT_UNREACHABLE(); } } diff --git a/gdk/gdk_system.h b/gdk/gdk_system.h --- a/gdk/gdk_system.h +++ b/gdk/gdk_system.h @@ -80,6 +80,19 @@ #define __warn_unused_result__ #endif +/* unreachable code */ +#if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5)) +#define MT_UNREACHABLE() do { assert(0); __builtin_unreachable(); } while (0) +#elif defined(__clang__) || defined(__INTEL_COMPILER) +#define MT_UNREACHABLE() do { assert(0); __builtin_unreachable(); } while (0) +#elif defined(_MSC_VER) +#define MT_UNREACHABLE() do { assert(0); __assume(0); } while (0) +#else +/* we don't know how to tell the compiler, so call a function that + * doesn't return */ +#define MT_UNREACHABLE() do { assert(0); GDKfatal("Unreachable C code path reached"); } while (0) +#endif + /* also see gdk.h for these */ #define THRDMASK (1) #define TEMMASK (1<<10) _______________________________________________ checkin-list mailing list -- checkin-list@monetdb.org To unsubscribe send an email to checkin-list-le...@monetdb.org