From 56ec7b2901a5eb8c2d48aba65eee5eb82640b152 Mon Sep 17 00:00:00 2001 From: "jan.nijtmans" Date: Mon, 2 Jun 2025 14:18:14 +0000 Subject: Backport: Add [[unreachable]] and [[fallthrough]] from C23 (where available) --- generic/tclBasic.c | 7 +++-- generic/tclBinary.c | 60 ++++++++++++++++++++++----------------- generic/tclClock.c | 15 ++++++++-- generic/tclClockFmt.c | 71 ++++++++++++++++++++++++++++------------------- generic/tclCmdAH.c | 6 ++-- generic/tclCmdMZ.c | 17 ++++++++++-- generic/tclCompCmdsGR.c | 1 + generic/tclCompCmdsSZ.c | 2 +- generic/tclCompile.c | 9 +++++- generic/tclConfig.c | 3 +- generic/tclDate.h | 2 +- generic/tclDictObj.c | 27 +++++++++--------- generic/tclEncoding.c | 6 ++-- generic/tclEnsemble.c | 9 ++++-- generic/tclEvent.c | 4 ++- generic/tclFileName.c | 2 ++ generic/tclIOCmd.c | 8 ++++-- generic/tclIORChan.c | 2 ++ generic/tclIcu.c | 13 ++++++--- generic/tclInt.h | 26 +++++++++++++++++ generic/tclInterp.c | 21 ++++++++++---- generic/tclLink.c | 2 +- generic/tclLoad.c | 7 +++-- generic/tclNamesp.c | 8 +++--- generic/tclOOBasic.c | 27 ++++-------------- generic/tclOOCall.c | 6 ++-- generic/tclOODefineCmds.c | 6 ++-- generic/tclOOInfo.c | 14 ++++++++-- generic/tclOOProp.c | 6 ++++ generic/tclParse.c | 11 ++++++-- generic/tclPathObj.c | 5 +--- generic/tclPkg.c | 22 ++++++--------- generic/tclProc.c | 6 ++-- generic/tclProcess.c | 3 +- generic/tclScan.c | 14 ++++------ generic/tclStrIdxTree.c | 8 ++++-- generic/tclStrToD.c | 53 ++++++++++++++++++++++------------- generic/tclStringObj.c | 20 +++++++------ generic/tclTest.c | 2 +- generic/tclTimer.c | 2 +- generic/tclTrace.c | 16 +++++++++-- generic/tclUtil.c | 6 ++-- generic/tclVar.c | 8 ++++-- generic/tclZipfs.c | 2 ++ generic/tclZlib.c | 35 ++++++++++++++--------- unix/tclUnixChan.c | 12 ++++---- win/tclWinPipe.c | 2 +- 47 files changed, 386 insertions(+), 228 deletions(-) diff --git a/generic/tclBasic.c b/generic/tclBasic.c index 6c73ed0..94d464f 100644 --- a/generic/tclBasic.c +++ b/generic/tclBasic.c @@ -4620,7 +4620,8 @@ Dispatch( } if (TCL_DTRACE_CMD_INFO_ENABLED() && iPtr->cmdFramePtr) { Tcl_Obj *info = TclInfoFrame(interp, iPtr->cmdFramePtr); - const char *a[6]; Tcl_Size i[2]; + const char *a[6]; + Tcl_Size i[2]; TclDTraceInfo(info, a, i); TCL_DTRACE_CMD_INFO(a[0], a[1], a[2], a[3], i[0], i[1], a[4], a[5]); @@ -6548,7 +6549,7 @@ Tcl_ExprLongObj( } resultPtr = Tcl_NewBignumObj(&big); } - /* FALLTHRU */ + TCL_FALLTHROUGH(); case TCL_NUMBER_INT: case TCL_NUMBER_BIG: result = TclGetLongFromObj(interp, resultPtr, ptr); @@ -9616,7 +9617,7 @@ TclNRInterpCoroutine( Tcl_SetErrorCode(interp, "TCL", "WRONGARGS", (char *)NULL); return TCL_ERROR; } - /* fallthrough */ + TCL_FALLTHROUGH(); case COROUTINE_ARGUMENTS_ARBITRARY: if (objc > 1) { Tcl_SetObjResult(interp, Tcl_NewListObj(objc - 1, objv + 1)); diff --git a/generic/tclBinary.c b/generic/tclBinary.c index 675f250..5094a88 100644 --- a/generic/tclBinary.c +++ b/generic/tclBinary.c @@ -2505,6 +2505,8 @@ BinaryDecodeHex( case OPT_STRICT: strict = 1; break; + default: + TCL_UNREACHABLE(); } } @@ -2649,6 +2651,8 @@ BinaryEncode64( wrapchar = TclGetStringFromObj(objv[i + 1], &wrapcharlen); } break; + default: + TCL_UNREACHABLE(); } } if (wrapcharlen == 0) { @@ -2773,36 +2777,36 @@ BinaryEncodeUu( case OPT_WRAPCHAR: wrapchar = (const unsigned char *)TclGetStringFromObj( objv[i + 1], &wrapcharlen); - { - const unsigned char *p = wrapchar; - Tcl_Size numBytes = wrapcharlen; - - while (numBytes) { - switch (*p) { - case '\t': - case '\v': - case '\f': - case '\r': - p++; numBytes--; - continue; - case '\n': - numBytes--; - break; - default: - badwrap: - Tcl_SetObjResult(interp, Tcl_NewStringObj( - "invalid wrapchar; will defeat decoding", - -1)); - Tcl_SetErrorCode(interp, "TCL", "BINARY", - "ENCODE", "WRAPCHAR", (char *)NULL); - return TCL_ERROR; - } - } - if (numBytes) { + const unsigned char *p = wrapchar; + Tcl_Size numBytes = wrapcharlen; + + while (numBytes) { + switch (*p) { + case '\t': + case '\v': + case '\f': + case '\r': + p++; + numBytes--; + continue; + case '\n': + numBytes--; + break; + default: goto badwrap; } } + if (numBytes) { + badwrap: + Tcl_SetObjResult(interp, Tcl_NewStringObj( + "invalid wrapchar; will defeat decoding", -1)); + Tcl_SetErrorCode(interp, "TCL", "BINARY", + "ENCODE", "WRAPCHAR", (char *)NULL); + return TCL_ERROR; + } break; + default: + TCL_UNREACHABLE(); } } @@ -2909,6 +2913,8 @@ BinaryDecodeUu( case OPT_STRICT: strict = 1; break; + default: + TCL_UNREACHABLE(); } } @@ -3084,6 +3090,8 @@ BinaryDecode64( case OPT_STRICT: strict = 1; break; + default: + TCL_UNREACHABLE(); } } diff --git a/generic/tclClock.c b/generic/tclClock.c index d4edec4..a850058 100644 --- a/generic/tclClock.c +++ b/generic/tclClock.c @@ -1154,6 +1154,8 @@ ClockConfigureObjCmd( } break; } + default: + TCL_UNREACHABLE(); } } @@ -3159,6 +3161,8 @@ ClockClicksObjCmd( case CLICKS_MICROS: clicks = TclpGetMicroseconds(); break; + default: + TCL_UNREACHABLE(); } Tcl_SetObjResult(interp, Tcl_NewWideIntObj(clicks)); @@ -3371,6 +3375,8 @@ ClockParseFmtScnArgs( } } break; + default: + TCL_UNREACHABLE(); } saw |= 1 << optionIndex; } @@ -3431,8 +3437,8 @@ ClockParseFmtScnArgs( } Tcl_SetObjResult(interp, Tcl_ObjPrintf( - "bad seconds \"%s\": must be now or integer", - TclGetString(baseObj))); + "bad seconds \"%s\": must be now or integer", + TclGetString(baseObj))); i = baseIdx; goto badOption; } @@ -3624,7 +3630,8 @@ ClockScanObjCmd( } /* seconds are in localSeconds (relative base date), so reset time here */ - yyHour = yyMinutes = yySeconds = yySecondOfDay = 0; yyMeridian = MER24; + yyHour = yyMinutes = yySeconds = yySecondOfDay = 0; + yyMeridian = MER24; /* If free scan */ if (opts.formatObj == NULL) { @@ -4537,6 +4544,8 @@ ClockAddObjCmd( case CLC_ADD_SECONDS: yyRelSeconds += offs; break; + default: + TCL_UNREACHABLE(); } if (unitIndex < CLC_ADD_HOURS) { /* date units only */ info->flags |= CLF_RELCONV; diff --git a/generic/tclClockFmt.c b/generic/tclClockFmt.c index 358c4f0..7819ee5 100644 --- a/generic/tclClockFmt.c +++ b/generic/tclClockFmt.c @@ -565,7 +565,10 @@ ClockFmtScnStorageAllocProc( allocsize -= sizeof(hPtr->key); } - fss = (ClockFmtScnStorage *)Tcl_Alloc(allocsize); + fss = (ClockFmtScnStorage *)Tcl_AttemptAlloc(allocsize); + if (!fss) { + return NULL; + } /* initialize */ memset(fss, 0, sizeof(*fss)); @@ -1024,7 +1027,7 @@ static const char * FindTokenBegin( const char *p, const char *end, - ClockScanToken *tok, + const ClockScanToken *tok, int flags) { if (p < end) { @@ -1037,10 +1040,14 @@ FindTokenBegin( if (!(flags & CLF_STRICT)) { /* should match at least one digit or space */ while (!isdigit(UCHAR(*p)) && !isspace(UCHAR(*p)) && - (p = Tcl_UtfNext(p)) < end) {} + (p = Tcl_UtfNext(p)) < end) { + // Empty + } } else { /* should match at least one digit */ - while (!isdigit(UCHAR(*p)) && (p = Tcl_UtfNext(p)) < end) {} + while (!isdigit(UCHAR(*p)) && (p = Tcl_UtfNext(p)) < end) { + // Empty + } } return p; @@ -1049,19 +1056,25 @@ FindTokenBegin( goto findChar; case CTOKT_SPACE: - while (!isspace(UCHAR(*p)) && (p = Tcl_UtfNext(p)) < end) {} + while (!isspace(UCHAR(*p)) && (p = Tcl_UtfNext(p)) < end) { + // Empty + } return p; case CTOKT_CHAR: c = *((char *)tok->map->data); -findChar: + findChar: if (!(flags & CLF_STRICT)) { /* should match the char or space */ while (*p != c && !isspace(UCHAR(*p)) && - (p = Tcl_UtfNext(p)) < end) {} + (p = Tcl_UtfNext(p)) < end) { + // Empty + } } else { /* should match the char */ - while (*p != c && (p = Tcl_UtfNext(p)) < end) {} + while (*p != c && (p = Tcl_UtfNext(p)) < end) { + // Empty + } } return p; } @@ -1089,7 +1102,7 @@ static void DetermineGreedySearchLen( ClockFmtScnCmdArgs *opts, DateInfo *info, - ClockScanToken *tok, + const ClockScanToken *tok, int *minLenPtr, int *maxLenPtr) { @@ -1141,7 +1154,7 @@ DetermineGreedySearchLen( /* try to get max length more precise for greedy match, * check the next ahead token available there */ if (minLen < maxLen && tok->lookAhTok) { - ClockScanToken *laTok = tok + tok->lookAhTok + 1; + const ClockScanToken *laTok = tok + tok->lookAhTok + 1; p = yyInput + maxLen; /* regards all possible spaces here (because they are optional) */ @@ -1155,7 +1168,7 @@ DetermineGreedySearchLen( /* try to find laTok between [lookAhMin, lookAhMax] */ while (minLen < maxLen) { const char *f = FindTokenBegin(p, end, laTok, - TCL_CLOCK_FULL_COMPAT ? opts->flags : CLF_STRICT); + TCL_CLOCK_FULL_COMPAT ? opts->flags : CLF_STRICT); /* if found (not below lookAhMax) */ if (f < end) { break; @@ -1491,7 +1504,7 @@ StaticListSearch( static inline const char * FindWordEnd( - ClockScanToken *tok, + const ClockScanToken *tok, const char *p, const char *end) { @@ -1516,7 +1529,7 @@ static int ClockScnToken_Month_Proc( ClockFmtScnCmdArgs *opts, DateInfo *info, - ClockScanToken *tok) + const ClockScanToken *tok) { #if 0 /* currently unused, test purposes only */ @@ -1566,7 +1579,7 @@ static int ClockScnToken_DayOfWeek_Proc( ClockFmtScnCmdArgs *opts, DateInfo *info, - ClockScanToken *tok) + const ClockScanToken *tok) { static int dowKeys[] = {MCLIT_DAYS_OF_WEEK_ABBREV, MCLIT_DAYS_OF_WEEK_FULL, 0}; @@ -1640,7 +1653,7 @@ static int ClockScnToken_amPmInd_Proc( ClockFmtScnCmdArgs *opts, DateInfo *info, - ClockScanToken *tok) + const ClockScanToken *tok) { int ret, val; int minLen, maxLen; @@ -1673,7 +1686,7 @@ static int ClockScnToken_LocaleERA_Proc( ClockFmtScnCmdArgs *opts, DateInfo *info, - ClockScanToken *tok) + const ClockScanToken *tok) { ClockClientData *dataPtr = opts->dataPtr; @@ -1712,7 +1725,7 @@ static int ClockScnToken_LocaleListMatcher_Proc( ClockFmtScnCmdArgs *opts, DateInfo *info, - ClockScanToken *tok) + const ClockScanToken *tok) { int ret, val; int minLen, maxLen; @@ -1743,7 +1756,7 @@ static int ClockScnToken_JDN_Proc( ClockFmtScnCmdArgs *opts, DateInfo *info, - ClockScanToken *tok) + const ClockScanToken *tok) { int minLen, maxLen; const char *p = yyInput, *end, *s; @@ -1814,7 +1827,7 @@ static int ClockScnToken_TimeZone_Proc( ClockFmtScnCmdArgs *opts, DateInfo *info, - ClockScanToken *tok) + const ClockScanToken *tok) { int minLen, maxLen; int len = 0; @@ -1906,7 +1919,7 @@ static int ClockScnToken_StarDate_Proc( ClockFmtScnCmdArgs *opts, DateInfo *info, - ClockScanToken *tok) + const ClockScanToken *tok) { int minLen, maxLen; const char *p = yyInput, *end, *s; @@ -2300,8 +2313,7 @@ ClockGetOrParseScanFormat( tokCnt++; continue; } - word_tok: - { + word_tok: { /* try continue with previous word token */ ClockScanToken *wordTok = tok - 1; @@ -2324,9 +2336,9 @@ ClockGetOrParseScanFormat( AllocTokenInChain(tok, scnTok, fss->scnTokC, ClockScanToken *); tokCnt++; } - } break; } + } } /* calculate end distance value for each tokens */ @@ -2373,8 +2385,8 @@ ClockScan( ClockFmtScnCmdArgs *opts) /* Command options */ { ClockClientData *dataPtr = opts->dataPtr; - ClockFmtScnStorage *fss; - ClockScanToken *tok; + const ClockFmtScnStorage *fss; + const ClockScanToken *tok; const ClockScanTokenMap *map; const char *p, *x, *end; unsigned short flags = 0; @@ -2554,6 +2566,8 @@ ClockScan( } p++; break; + default: + TCL_UNREACHABLE(); } } /* check end was reached */ @@ -2602,7 +2616,7 @@ ClockScan( case (CLF_DAYOFYEAR | CLF_DAYOFMONTH): /* miss month: ddd over dd (without month) */ flags &= ~CLF_DAYOFMONTH; - /* fallthrough */ + TCL_FALLTHROUGH(); case CLF_DAYOFYEAR: /* ddd over naked weekday */ if (!(flags & CLF_ISO8601YEAR)) { @@ -3343,8 +3357,7 @@ ClockGetOrParseFmtFormat( continue; } default: - word_tok: - { + word_tok: { /* try continue with previous word token */ ClockFormatToken *wordTok = tok - 1; @@ -3363,9 +3376,9 @@ ClockGetOrParseFmtFormat( AllocTokenInChain(tok, fmtTok, fss->fmtTokC, ClockFormatToken *); tokCnt++; } - } break; } + } } /* correct count of real used tokens and free mem if desired diff --git a/generic/tclCmdAH.c b/generic/tclCmdAH.c index 877b3bb..673b4f8 100644 --- a/generic/tclCmdAH.c +++ b/generic/tclCmdAH.c @@ -485,6 +485,8 @@ EncodingConvertParseOptions( case FAILINDEX: failVarObj = objv[argIndex]; break; + default: + TCL_UNREACHABLE(); } } /* Get encoding after opts so no need to free it on option error */ @@ -2152,8 +2154,7 @@ PathTypeCmd( TclNewLiteralStringObj(typeName, "volumerelative"); break; default: - /* Should be unreachable */ - return TCL_OK; + TCL_UNREACHABLE(); } Tcl_SetObjResult(interp, typeName); return TCL_OK; @@ -2962,6 +2963,7 @@ ForeachLoopStep( "\n (\"%s\" body line %d)", (statePtr->resultList != NULL ? "lmap" : "foreach"), Tcl_GetErrorLine(interp))); + TCL_FALLTHROUGH(); default: goto done; } diff --git a/generic/tclCmdMZ.c b/generic/tclCmdMZ.c index fb04232..22329fe 100644 --- a/generic/tclCmdMZ.c +++ b/generic/tclCmdMZ.c @@ -211,6 +211,8 @@ Tcl_RegexpObjCmd( case REGEXP_LAST: i++; goto endOfForLoop; + default: + TCL_UNREACHABLE(); } } @@ -566,6 +568,8 @@ Tcl_RegsubObjCmd( case REGSUB_LAST: idx++; goto endOfForLoop; + default: + TCL_UNREACHABLE(); } } @@ -1580,6 +1584,8 @@ StringIsCmd( } failVarObj = objv[++i]; break; + default: + TCL_UNREACHABLE(); } } } @@ -1877,6 +1883,8 @@ StringIsCmd( case STR_IS_XDIGIT: chcomp = UniCharIsHexDigit; break; + default: + TCL_UNREACHABLE(); } if (chcomp != NULL) { @@ -4186,6 +4194,8 @@ Tcl_TimeRateObjCmd( break; case TMRT_LAST: break; + default: + TCL_UNREACHABLE(); } } @@ -4410,7 +4420,7 @@ Tcl_TimeRateObjCmd( */ threshold = 1; maxcnt = 0; - /* FALLTHRU */ + TCL_FALLTHROUGH(); case TCL_CONTINUE: result = TCL_OK; break; @@ -4499,7 +4509,8 @@ Tcl_TimeRateObjCmd( lastIterTm = avgIterTm; } estIterTm *= lastIterTm; - last = middle; lastCount = count; + last = middle; + lastCount = count; /* * Calculate next threshold to check. @@ -4836,6 +4847,8 @@ TclNRTryObjCmd( haveHandlers = 1; i += 3; break; + default: + TCL_UNREACHABLE(); } } if (bodyShared) { diff --git a/generic/tclCompCmdsGR.c b/generic/tclCompCmdsGR.c index 45befc7..c373018 100644 --- a/generic/tclCompCmdsGR.c +++ b/generic/tclCompCmdsGR.c @@ -2201,6 +2201,7 @@ TclCompileRegsubCmd( * but we definitely can't handle that at all. */ } + TCL_FALLTHROUGH(); case '\0': case '?': case '[': case '\\': goto done; } diff --git a/generic/tclCompCmdsSZ.c b/generic/tclCompCmdsSZ.c index 38fd8d6..5e27796 100644 --- a/generic/tclCompCmdsSZ.c +++ b/generic/tclCompCmdsSZ.c @@ -2221,7 +2221,7 @@ IssueSwitchChainedTests( } break; default: - Tcl_Panic("unknown switch mode: %d", mode); + TCL_UNREACHABLE(); } /* diff --git a/generic/tclCompile.c b/generic/tclCompile.c index a0ddd08..beb716c 100644 --- a/generic/tclCompile.c +++ b/generic/tclCompile.c @@ -1208,12 +1208,18 @@ IsCompactibleCompileEnv( case INST_EVAL_STK: case INST_EXPR_STK: case INST_YIELD: + case INST_YIELD_TO_INVOKE: return 0; /* Upvars */ case INST_UPVAR: case INST_NSUPVAR: case INST_VARIABLE: return 0; + /* TclOO::next is NOT a problem: puts stack frame out of way. + * There's a way to do it, but it's beneath the threshold of + * likelihood. */ + case INST_TCLOO_NEXT: + case INST_TCLOO_NEXT_CLASS: default: size = tclInstructionTable[*pc].numBytes; assert (size > 0); @@ -3485,7 +3491,8 @@ TclGetInnermostExceptionRange( ExceptionRange *rangePtr = envPtr->exceptArrayPtr + i; while (i > 0) { - rangePtr--; i--; + rangePtr--; + i--; if (CurrentOffset(envPtr) >= (int)rangePtr->codeOffset && (rangePtr->numCodeBytes == TCL_INDEX_NONE || CurrentOffset(envPtr) < diff --git a/generic/tclConfig.c b/generic/tclConfig.c index a297545..7a7ce37 100644 --- a/generic/tclConfig.c +++ b/generic/tclConfig.c @@ -299,8 +299,7 @@ QueryConfigObjCmd( return TCL_OK; default: - Tcl_Panic("QueryConfigObjCmd: Unknown subcommand to 'pkgconfig'. This can't happen"); - break; + TCL_UNREACHABLE(); } return TCL_ERROR; } diff --git a/generic/tclDate.h b/generic/tclDate.h index a63eb0e..366ae59 100644 --- a/generic/tclDate.h +++ b/generic/tclDate.h @@ -393,7 +393,7 @@ typedef struct ClockScanToken ClockScanToken; typedef int ClockScanTokenProc( ClockFmtScnCmdArgs *opts, DateInfo *info, - ClockScanToken *tok); + const ClockScanToken *tok); typedef enum _CLCKTOK_TYPE { CTOKT_INT = 1, CTOKT_WIDE, CTOKT_PARSER, CTOKT_SPACE, CTOKT_WORD, CTOKT_CHAR, diff --git a/generic/tclDictObj.c b/generic/tclDictObj.c index 6216430..505e2b2 100644 --- a/generic/tclDictObj.c +++ b/generic/tclDictObj.c @@ -3421,7 +3421,7 @@ DictFilterCmd( Tcl_ResetResult(interp); Tcl_DictObjDone(&search); - /* FALLTHRU */ + TCL_FALLTHROUGH(); case TCL_CONTINUE: result = TCL_OK; break; @@ -3429,6 +3429,7 @@ DictFilterCmd( Tcl_AppendObjToErrorInfo(interp, Tcl_ObjPrintf( "\n (\"dict filter\" script line %d)", Tcl_GetErrorLine(interp))); + TCL_FALLTHROUGH(); default: goto abnormalResult; } @@ -3454,20 +3455,18 @@ DictFilterCmd( TclDecrRefCount(resultObj); } return result; - - abnormalResult: - Tcl_DictObjDone(&search); - TclDecrRefCount(keyObj); - TclDecrRefCount(valueObj); - TclDecrRefCount(keyVarObj); - TclDecrRefCount(valueVarObj); - TclDecrRefCount(scriptObj); - TclDecrRefCount(resultObj); - return result; } - Tcl_Panic("unexpected fallthrough"); - /* Control never reaches this point. */ - return TCL_ERROR; + TCL_UNREACHABLE(); + + abnormalResult: + Tcl_DictObjDone(&search); + TclDecrRefCount(keyObj); + TclDecrRefCount(valueObj); + TclDecrRefCount(keyVarObj); + TclDecrRefCount(valueVarObj); + TclDecrRefCount(scriptObj); + TclDecrRefCount(resultObj); + return result; } /* diff --git a/generic/tclEncoding.c b/generic/tclEncoding.c index 3f26ab7..ce5fda4 100644 --- a/generic/tclEncoding.c +++ b/generic/tclEncoding.c @@ -2584,7 +2584,8 @@ UtfToUtfProc( } else { /* TCL_ENCODING_PROFILE_TCL8 */ char chbuf[2]; - chbuf[0] = UCHAR(*src++); chbuf[1] = 0; + chbuf[0] = UCHAR(*src++); + chbuf[1] = 0; TclUtfToUniChar(chbuf, &ch); } dst += Tcl_UniCharToUtf(ch, dst); @@ -3510,7 +3511,8 @@ TableToUtfProc( ch = UNICODE_REPLACE_CHAR; } else { char chbuf[2]; - chbuf[0] = byte; chbuf[1] = 0; + chbuf[0] = byte; + chbuf[1] = 0; TclUtfToUniChar(chbuf, &ch); } } diff --git a/generic/tclEnsemble.c b/generic/tclEnsemble.c index a11f382..cf4e18f 100644 --- a/generic/tclEnsemble.c +++ b/generic/tclEnsemble.c @@ -230,9 +230,8 @@ TclNamespaceEnsembleCmd( } default: - Tcl_Panic("unexpected ensemble command"); + TCL_UNREACHABLE(); } - return TCL_OK; } /* @@ -387,6 +386,8 @@ InitEnsembleFromOptions( } unknownObj = (len > 0 ? objv[1] : NULL); continue; + default: + TCL_UNREACHABLE(); } } @@ -485,6 +486,8 @@ ReadOneEnsembleOption( Tcl_SetObjResult(interp, resultObj); } break; + default: + TCL_UNREACHABLE(); } return TCL_OK; } @@ -715,6 +718,8 @@ SetEnsembleConfigOptions( } unknownObj = (len > 0 ? objv[1] : NULL); continue; + default: + TCL_UNREACHABLE(); } } diff --git a/generic/tclEvent.c b/generic/tclEvent.c index 4dd10d8..d991d66 100644 --- a/generic/tclEvent.c +++ b/generic/tclEvent.c @@ -1650,6 +1650,8 @@ Tcl_VwaitObjCmd( vwaitItems[numItems].sourceObj = objv[i]; numItems++; break; + default: + TCL_UNREACHABLE(); } } @@ -1967,7 +1969,7 @@ Tcl_UpdateObjCmd( flags = TCL_IDLE_EVENTS|TCL_DONT_WAIT; break; default: - Tcl_Panic("Tcl_UpdateObjCmd: bad option index to UpdateOptions"); + TCL_UNREACHABLE(); } } else { Tcl_WrongNumArgs(interp, 1, objv, "?idletasks?"); diff --git a/generic/tclFileName.c b/generic/tclFileName.c index 068a041..693018b 100644 --- a/generic/tclFileName.c +++ b/generic/tclFileName.c @@ -1233,6 +1233,8 @@ Tcl_GlobObjCmd( case GLOB_LAST: /* -- */ i++; goto endOfForLoop; + default: + TCL_UNREACHABLE(); } } diff --git a/generic/tclIOCmd.c b/generic/tclIOCmd.c index aefefee..485812f 100644 --- a/generic/tclIOCmd.c +++ b/generic/tclIOCmd.c @@ -135,7 +135,7 @@ Tcl_PutsObjCmd( string = objv[3]; break; } - /* Fall through */ + TCL_FALLTHROUGH(); default: /* [puts] or * [puts some bad number of arguments...] */ Tcl_WrongNumArgs(interp, 1, objv, "?-nonewline? ?channel? string"); @@ -1627,7 +1627,7 @@ Tcl_SocketObjCmd( } break; default: - Tcl_Panic("Tcl_SocketObjCmd: bad option index to SocketOptions"); + TCL_UNREACHABLE(); } } if (server) { @@ -1832,6 +1832,8 @@ Tcl_FcopyObjCmd( case FcopyCommand: cmdPtr = objv[i+1]; break; + default: + TCL_UNREACHABLE(); } } @@ -1898,6 +1900,8 @@ ChanPendingObjCmd( Tcl_SetObjResult(interp, Tcl_NewWideIntObj(Tcl_OutputBuffered(chan))); } break; + default: + TCL_UNREACHABLE(); } return TCL_OK; } diff --git a/generic/tclIORChan.c b/generic/tclIORChan.c index beb4d2c..d2d9d7a 100644 --- a/generic/tclIORChan.c +++ b/generic/tclIORChan.c @@ -2108,6 +2108,8 @@ EncodeEventMask( case EVENT_WRITE: events |= TCL_WRITABLE; break; + default: + TCL_UNREACHABLE(); } listc --; } diff --git a/generic/tclIcu.c b/generic/tclIcu.c index 3110281..a375d62 100644 --- a/generic/tclIcu.c +++ b/generic/tclIcu.c @@ -798,7 +798,7 @@ IcuConverttoDString( if (U_SUCCESS(status)) { break; } - /* FALLTHRU */ + TCL_FALLTHROUGH(); default: Tcl_DStringFree(dsOutPtr); ucnv_close(ucnvPtr); @@ -878,7 +878,7 @@ IcuBytesToUCharDString( if (U_SUCCESS(status)) { break; } - /* FALLTHRU */ + TCL_FALLTHROUGH(); default: Tcl_DStringFree(dsOutPtr); ucnv_close(ucnvPtr); @@ -974,7 +974,7 @@ IcuNormalizeUCharDString( if (U_SUCCESS(status)) { break; } - /* FALLTHRU */ + TCL_FALLTHROUGH(); default: Tcl_DStringFree(dsOutPtr); return IcuError(interp, "String normalization failed", status); @@ -1037,6 +1037,8 @@ static int IcuParseConvertOptions( Tcl_SetObjResult(interp, Tcl_NewStringObj("Option -failindex not implemented.", TCL_INDEX_NONE)); return TCL_ERROR; + default: + TCL_UNREACHABLE(); } } *strictPtr = strict; @@ -1205,6 +1207,8 @@ IcuNormalizeObjCmd( return TCL_ERROR; } break; + default: + TCL_UNREACHABLE(); } } @@ -1359,7 +1363,8 @@ TclIcuInit( /* Going back down to ICU version 60 */ while ((icu_fns.libs[0] == NULL) && (icuversion[1] >= '6')) { if (--icuversion[2] < '0') { - icuversion[1]--; icuversion[2] = '9'; + icuversion[1]--; + icuversion[2] = '9'; } #if defined(__CYGWIN__) i = 2; diff --git a/generic/tclInt.h b/generic/tclInt.h index 5aa7980..f088545 100644 --- a/generic/tclInt.h +++ b/generic/tclInt.h @@ -141,6 +141,32 @@ # define Tcl_ConditionFinalize(condPtr) #endif +// A way to mark a code path as unreachable. +#ifndef TCL_UNREACHABLE +#if defined(__STDC__) && __STDC__ >= 202311L +#include +#define TCL_UNREACHABLE() unreachable() +#elif defined(__GNUC__) +#define TCL_UNREACHABLE() __builtin_unreachable() +#elif defined(_MSC_VER) +#include +#define TCL_UNREACHABLE() __assume(false) +#else +#define TCL_UNREACHABLE() ((void) 0) +#endif +#endif // TCL_UNREACHABLE + +#ifndef TCL_FALLTHROUGH +#if defined(__STDC__) && __STDC__ >= 202311L +#define TCL_FALLTHROUGH() [[fallthrough]] +#elif defined(__GNUC__) +#define TCL_FALLTHROUGH() __attribute__((fallthrough)) +#else +// Nothing documented as an alternative to the standard [[fallthrough]]. +#define TCL_FALLTHROUGH() ((void) 0) +#endif +#endif // TCL_FALLTHROUGH + /* * The following procedures allow namespaces to be customized to support * special name resolution rules for commands/variables. diff --git a/generic/tclInterp.c b/generic/tclInterp.c index 91e9814..d58119e 100644 --- a/generic/tclInterp.c +++ b/generic/tclInterp.c @@ -756,6 +756,8 @@ NRInterpCmd( case OPT_LAST: i++; goto endOfForLoop; + default: + TCL_UNREACHABLE(); } } @@ -1022,8 +1024,7 @@ NRInterpCmd( case LIMIT_TYPE_TIME: return ChildTimeLimitCmd(interp, childInterp, 4, objc, objv); default: - Tcl_Panic("unreachable"); - return TCL_ERROR; + TCL_UNREACHABLE(); } } case OPT_MARKTRUSTED: @@ -1147,8 +1148,7 @@ NRInterpCmd( return TCL_OK; } default: - Tcl_Panic("unreachable"); - return TCL_ERROR; + TCL_UNREACHABLE(); } } @@ -2677,9 +2677,10 @@ NRChildCmd( return ChildCommandLimitCmd(interp, childInterp, 3, objc,objv); case LIMIT_TYPE_TIME: return ChildTimeLimitCmd(interp, childInterp, 3, objc, objv); + default: + TCL_UNREACHABLE(); } } - break; case OPT_MARKTRUSTED: if (objc != 2) { Tcl_WrongNumArgs(interp, 2, objv, NULL); @@ -2692,6 +2693,8 @@ NRChildCmd( return TCL_ERROR; } return ChildRecursionLimit(interp, childInterp, objc - 2, objv + 2); + default: + TCL_UNREACHABLE(); } return TCL_ERROR; @@ -4529,6 +4532,8 @@ ChildCommandLimitCmd( Tcl_NewWideIntObj(Tcl_LimitGetCommands(childInterp))); } break; + default: + TCL_UNREACHABLE(); } return TCL_OK; } else if ((objc-consumedObjc) & 1 /* isOdd(objc-consumedObjc) */) { @@ -4579,6 +4584,8 @@ ChildCommandLimitCmd( return TCL_ERROR; } break; + default: + TCL_UNREACHABLE(); } } if (scriptObj != NULL) { @@ -4729,6 +4736,8 @@ ChildTimeLimitCmd( Tcl_SetObjResult(interp, Tcl_NewWideIntObj(limitMoment.sec)); } break; + default: + TCL_UNREACHABLE(); } return TCL_OK; } else if ((objc-consumedObjc) & 1 /* isOdd(objc-consumedObjc) */) { @@ -4802,6 +4811,8 @@ ChildTimeLimitCmd( } limitMoment.sec = (long long) tmp; break; + default: + TCL_UNREACHABLE(); } } if (milliObj != NULL || secObj != NULL) { diff --git a/generic/tclLink.c b/generic/tclLink.c index d2fb2af..746d74a 100644 --- a/generic/tclLink.c +++ b/generic/tclLink.c @@ -1316,7 +1316,7 @@ ObjValue( Tcl_Obj *uwObj; TclNewUIntObj(uwObj, linkPtr->lastValue.uw); return uwObj; - } + } case TCL_LINK_STRING: p = LinkedVar(char *); diff --git a/generic/tclLoad.c b/generic/tclLoad.c index 96691cc..7e68744 100644 --- a/generic/tclLoad.c +++ b/generic/tclLoad.c @@ -156,13 +156,14 @@ Tcl_LoadObjCmd( &index) != TCL_OK) { return TCL_ERROR; } - ++objv; --objc; + ++objv; + --objc; if (LOAD_GLOBAL == index) { flags |= TCL_LOAD_GLOBAL; } else if (LOAD_LAZY == index) { flags |= TCL_LOAD_LAZY; } else { - break; + break; } } if ((objc < 2) || (objc > 4)) { @@ -598,6 +599,8 @@ Tcl_UnloadObjCmd( case UNLOAD_LAST: /* -- */ i++; goto endOfForLoop; + default: + TCL_UNREACHABLE(); } } endOfForLoop: diff --git a/generic/tclNamesp.c b/generic/tclNamesp.c index fed0dda..5acb014 100644 --- a/generic/tclNamesp.c +++ b/generic/tclNamesp.c @@ -4770,15 +4770,14 @@ NamespaceWhichCmd( TclNewObj(resultPtr); switch (lookupType) { - case 0: { /* -command */ + case 0:; /* -command */ Tcl_Command cmd = Tcl_GetCommandFromObj(interp, objv[objc-1]); if (cmd != NULL) { Tcl_GetCommandFullName(interp, cmd, resultPtr); } break; - } - case 1: { /* -variable */ + case 1:; /* -variable */ Tcl_Var var = Tcl_FindNamespaceVar(interp, TclGetString(objv[objc-1]), NULL, /*flags*/ 0); @@ -4786,7 +4785,8 @@ NamespaceWhichCmd( Tcl_GetVariableFullName(interp, var, resultPtr); } break; - } + default: + TCL_UNREACHABLE(); } Tcl_SetObjResult(interp, resultPtr); return TCL_OK; diff --git a/generic/tclOOBasic.c b/generic/tclOOBasic.c index 36b9e9c..f7bb969 100644 --- a/generic/tclOOBasic.c +++ b/generic/tclOOBasic.c @@ -1207,13 +1207,7 @@ TclOOSelfObjCmd( } else if (mPtr->declaringObjectPtr != NULL) { declarerPtr = mPtr->declaringObjectPtr; } else { - /* - * This should be unreachable code. - */ - - Tcl_SetObjResult(interp, Tcl_NewStringObj( - "method without declarer!", TCL_AUTO_LENGTH)); - return TCL_ERROR; + TCL_UNREACHABLE(); } result[0] = TclOOObjectName(interp, declarerPtr); @@ -1239,13 +1233,7 @@ TclOOSelfObjCmd( } else if (mPtr->declaringObjectPtr != NULL) { declarerPtr = mPtr->declaringObjectPtr; } else { - /* - * This should be unreachable code. - */ - - Tcl_SetObjResult(interp, Tcl_NewStringObj( - "method without declarer!", TCL_AUTO_LENGTH)); - return TCL_ERROR; + TCL_UNREACHABLE(); } result[0] = TclOOObjectName(interp, declarerPtr); @@ -1284,13 +1272,7 @@ TclOOSelfObjCmd( } else if (mPtr->declaringObjectPtr != NULL) { declarerPtr = mPtr->declaringObjectPtr; } else { - /* - * This should be unreachable code. - */ - - Tcl_SetObjResult(interp, Tcl_NewStringObj( - "method without declarer!", TCL_AUTO_LENGTH)); - return TCL_ERROR; + TCL_UNREACHABLE(); } result[0] = TclOOObjectName(interp, declarerPtr); result[1] = mPtr->namePtr; @@ -1302,8 +1284,9 @@ TclOOSelfObjCmd( TclNewIndexObj(result[1], contextPtr->index); Tcl_SetObjResult(interp, Tcl_NewListObj(2, result)); return TCL_OK; + default: + TCL_UNREACHABLE(); } - return TCL_ERROR; } /* diff --git a/generic/tclOOCall.c b/generic/tclOOCall.c index 04d53fc..6c18b85 100644 --- a/generic/tclOOCall.c +++ b/generic/tclOOCall.c @@ -1647,6 +1647,7 @@ AddClassFiltersToCallContext( AddClassFiltersToCallContext(oPtr, superPtr, cbPtr, doneFilters, flags); } + TCL_FALLTHROUGH(); case 0: return; } @@ -1734,7 +1735,7 @@ AddPrivatesFromClassChainToCallContext( return 1; } } - /* FALLTHRU */ + TCL_FALLTHROUGH(); case 0: return 0; } @@ -1829,7 +1830,7 @@ AddSimpleClassChainToCallContext( privateDanger |= AddSimpleClassChainToCallContext(superPtr, methodNameObj, cbPtr, doneFilters, flags, filterDecl); } - /* FALLTHRU */ + TCL_FALLTHROUGH(); case 0: return privateDanger; } @@ -2067,6 +2068,7 @@ AddSimpleClassDefineNamespaces( FOREACH(superPtr, classPtr->superclasses) { AddSimpleClassDefineNamespaces(superPtr, definePtr, flags); } + TCL_FALLTHROUGH(); case 0: return; } diff --git a/generic/tclOODefineCmds.c b/generic/tclOODefineCmds.c index efc88bd..e029649 100644 --- a/generic/tclOODefineCmds.c +++ b/generic/tclOODefineCmds.c @@ -1738,9 +1738,9 @@ TclOODefineDefnNsObjCmd( * Update the correct field of the class definition. */ - if (kind) { + if (kind) { // -instance storagePtr = &clsPtr->objDefinitionNs; - } else { + } else { // -class storagePtr = &clsPtr->clsDefinitionNs; } if (*storagePtr != NULL) { @@ -2097,6 +2097,8 @@ TclOODefineMethodObjCmd( case MODE_UNEXPORT: isPublic = 0; break; + default: + TCL_UNREACHABLE(); } } else { if (IsPrivateDefine(interp)) { diff --git a/generic/tclOOInfo.c b/generic/tclOOInfo.c index 56562dc..bec931a 100644 --- a/generic/tclOOInfo.c +++ b/generic/tclOOInfo.c @@ -485,6 +485,8 @@ InfoObjectIsACmd( return TCL_ERROR; } break; + default: + TCL_UNREACHABLE(); } /* @@ -538,6 +540,8 @@ InfoObjectIsACmd( result = TclOOIsReachable(o2Ptr->classPtr, oPtr->selfCls); } break; + default: + TCL_UNREACHABLE(); } Tcl_SetObjResult(interp, Tcl_NewBooleanObj(result)); return TCL_OK; @@ -628,6 +632,8 @@ InfoObjectMethodsCmd( return TCL_ERROR; } break; + default: + TCL_UNREACHABLE(); } } } @@ -1145,9 +1151,9 @@ InfoClassDefnNsCmd( return TCL_ERROR; } - if (kind) { + if (kind) { // -instance nsNamePtr = clsPtr->objDefinitionNs; - } else { + } else { // -class nsNamePtr = clsPtr->clsDefinitionNs; } if (nsNamePtr) { @@ -1412,6 +1418,8 @@ InfoClassMethodsCmd( return TCL_ERROR; } break; + default: + TCL_UNREACHABLE(); } } } @@ -1427,6 +1435,8 @@ InfoClassMethodsCmd( case SCOPE_UNEXPORTED: flag = 0; break; + default: + TCL_UNREACHABLE(); } } diff --git a/generic/tclOOProp.c b/generic/tclOOProp.c index 8d75aaf..35c84e7 100644 --- a/generic/tclOOProp.c +++ b/generic/tclOOProp.c @@ -1099,6 +1099,8 @@ TclOODefinePropertyCmd( return TCL_ERROR; } break; + default: + TCL_UNREACHABLE(); } } @@ -1221,6 +1223,8 @@ TclOOInfoClassPropCmd( case PROP_WRITABLE: writable = 1; break; + default: + TCL_UNREACHABLE(); } } @@ -1279,6 +1283,8 @@ TclOOInfoObjectPropCmd( case PROP_WRITABLE: writable = 1; break; + default: + TCL_UNREACHABLE(); } } diff --git a/generic/tclParse.c b/generic/tclParse.c index dca351c..88368cc 100644 --- a/generic/tclParse.c +++ b/generic/tclParse.c @@ -1382,7 +1382,8 @@ Tcl_ParseVarName( */ if (*src == '{') { - char ch; int braceCount = 0; + char ch; + int braceCount = 0; src++; numBytes--; tokenPtr->type = TCL_TOKEN_TEXT; @@ -1392,8 +1393,12 @@ Tcl_ParseVarName( ch = *src; while (numBytes && (braceCount>0 || ch != '}')) { switch (ch) { - case '{': braceCount++; break; - case '}': braceCount--; break; + case '{': + braceCount++; + break; + case '}': + braceCount--; + break; case '\\': /* if 2 or more left, consume 2, else consume * just the \ and let it run into the end */ diff --git a/generic/tclPathObj.c b/generic/tclPathObj.c index db1a96a..02aa402 100644 --- a/generic/tclPathObj.c +++ b/generic/tclPathObj.c @@ -679,10 +679,7 @@ TclPathPart( } } default: - /* We should never get here */ - Tcl_Panic("Bad portion to TclPathPart"); - /* For less clever compilers */ - return NULL; + TCL_UNREACHABLE(); } } else if (fsPathPtr->cwdPtr != NULL) { /* Relative path */ diff --git a/generic/tclPkg.c b/generic/tclPkg.c index fc48631..de7f6cf 100644 --- a/generic/tclPkg.c +++ b/generic/tclPkg.c @@ -1098,13 +1098,12 @@ TclNRPackageObjCmd( } switch (optionIndex) { case PKG_FILES: { - PkgFiles *pkgFiles; - if (objc != 3) { Tcl_WrongNumArgs(interp, 2, objv, "package"); return TCL_ERROR; } - pkgFiles = (PkgFiles *) Tcl_GetAssocData(interp, "tclPkgFiles", NULL); + PkgFiles *pkgFiles = (PkgFiles *) + Tcl_GetAssocData(interp, "tclPkgFiles", NULL); if (pkgFiles) { Tcl_HashEntry *entry = Tcl_FindHashEntry(&pkgFiles->table, TclGetString(objv[2])); @@ -1116,12 +1115,11 @@ TclNRPackageObjCmd( break; } case PKG_FORGET: { - const char *keyString; PkgFiles *pkgFiles = (PkgFiles *) Tcl_GetAssocData(interp, "tclPkgFiles", NULL); for (i = 2; i < objc; i++) { - keyString = TclGetString(objv[i]); + const char *keyString = TclGetString(objv[i]); if (pkgFiles) { hPtr = Tcl_FindHashEntry(&pkgFiles->table, keyString); if (hPtr) { @@ -1157,8 +1155,7 @@ TclNRPackageObjCmd( } case PKG_IFNEEDED: { Tcl_Size length; - int res; - char *argv3i, *avi; + char *argv3i; if ((objc != 4) && (objc != 5)) { Tcl_WrongNumArgs(interp, 2, objv, "package version ?script?"); @@ -1183,13 +1180,14 @@ TclNRPackageObjCmd( for (availPtr = pkgPtr->availPtr, prevPtr = NULL; availPtr != NULL; prevPtr = availPtr, availPtr = availPtr->nextPtr) { + char *avi; if (CheckVersionAndConvert(interp, availPtr->version, &avi, NULL) != TCL_OK) { Tcl_Free(argv3i); return TCL_ERROR; } - res = CompareVersions(avi, argv3i, NULL); + int res = CompareVersions(avi, argv3i, NULL); Tcl_Free(avi); if (res == 0) { @@ -1394,9 +1392,7 @@ TclNRPackageObjCmd( return TCL_OK; } break; - case PKG_UNKNOWN: { - Tcl_Size length; - + case PKG_UNKNOWN: if (objc == 2) { if (iPtr->packageUnknown != NULL) { Tcl_SetObjResult(interp, @@ -1406,6 +1402,7 @@ TclNRPackageObjCmd( if (iPtr->packageUnknown != NULL) { Tcl_Free(iPtr->packageUnknown); } + Tcl_Size length; argv2 = TclGetStringFromObj(objv[2], &length); if (argv2[0] == 0) { iPtr->packageUnknown = NULL; @@ -1417,7 +1414,6 @@ TclNRPackageObjCmd( return TCL_ERROR; } break; - } case PKG_PREFER: { static const char *const pkgPreferOptions[] = { "latest", "stable", NULL @@ -1528,7 +1524,7 @@ TclNRPackageObjCmd( break; } default: - Tcl_Panic("Tcl_PackageObjCmd: bad option index to pkgOptions"); + TCL_UNREACHABLE(); } return TCL_OK; } diff --git a/generic/tclProc.c b/generic/tclProc.c index 4455602..cc3d5fb 100644 --- a/generic/tclProc.c +++ b/generic/tclProc.c @@ -1761,7 +1761,8 @@ TclNRInterpProcCore( } if (TCL_DTRACE_PROC_INFO_ENABLED() && iPtr->cmdFramePtr) { Tcl_Obj *info = TclInfoFrame(interp, iPtr->cmdFramePtr); - const char *a[6]; Tcl_Size i[2]; + const char *a[6]; + Tcl_Size i[2]; TclDTraceInfo(info, a, i); TCL_DTRACE_PROC_INFO(a[0], a[1], a[2], a[3], i[0], i[1], a[4], a[5]); @@ -1874,8 +1875,7 @@ InterpProcNR2( ((result == TCL_BREAK) ? "break" : "continue"))); Tcl_SetErrorCode(interp, "TCL", "RESULT", "UNEXPECTED", (char *)NULL); result = TCL_ERROR; - - /* FALLTHRU */ + TCL_FALLTHROUGH(); case TCL_ERROR: /* diff --git a/generic/tclProcess.c b/generic/tclProcess.c index bed3a60..8a592cd 100644 --- a/generic/tclProcess.c +++ b/generic/tclProcess.c @@ -499,7 +499,8 @@ ProcessStatusObjCmd( &index) != TCL_OK) { return TCL_ERROR; } - ++objv; --objc; + ++objv; + --objc; if (STATUS_WAIT == index) { options = 0; } else { diff --git a/generic/tclScan.c b/generic/tclScan.c index ba7cb72..feddedc 100644 --- a/generic/tclScan.c +++ b/generic/tclScan.c @@ -396,11 +396,11 @@ ValidateFormat( format += TclUtfToUniChar(format, &ch); break; } - /* FALLTHRU */ + TCL_FALLTHROUGH(); case 'j': case 'q': flags |= SCAN_LONGER; - /* FALLTHRU */ + TCL_FALLTHROUGH(); case 'h': format += TclUtfToUniChar(format, &ch); } @@ -422,7 +422,7 @@ ValidateFormat( Tcl_SetErrorCode(interp, "TCL", "FORMAT", "BADWIDTH", (char *)NULL); goto error; } - /* FALLTHRU */ + TCL_FALLTHROUGH(); case 'n': case 's': if (flags & (SCAN_LONGER|SCAN_BIG)) { @@ -436,9 +436,7 @@ ValidateFormat( Tcl_SetErrorCode(interp, "TCL", "FORMAT", "BADSIZE", (char *)NULL); goto error; } - /* - * Fall through! - */ + TCL_FALLTHROUGH(); case 'd': case 'e': case 'E': @@ -749,11 +747,11 @@ Tcl_ScanObjCmd( format += TclUtfToUniChar(format, &ch); break; } - /* FALLTHRU */ + TCL_FALLTHROUGH(); case 'j': case 'q': flags |= SCAN_LONGER; - /* FALLTHRU */ + TCL_FALLTHROUGH(); case 'h': format += TclUtfToUniChar(format, &ch); } diff --git a/generic/tclStrIdxTree.c b/generic/tclStrIdxTree.c index 07accc2..c6cf5ff 100644 --- a/generic/tclStrIdxTree.c +++ b/generic/tclStrIdxTree.c @@ -524,12 +524,12 @@ TclStrIdxTreeTestObjCmd( case O_INDEX: case O_PUTS_INDEX: { - Tcl_Obj **lstv; - Tcl_Size i, lstc; TclStrIdxTree idxTree = {NULL, NULL}; - i = 1; + Tcl_Size i = 1; while (++i < objc) { + Tcl_Obj **lstv; + Tcl_Size lstc; if (TclListObjGetElements(interp, objv[i], &lstc, &lstv) != TCL_OK) { return TCL_ERROR; @@ -542,6 +542,8 @@ TclStrIdxTreeTestObjCmd( TclStrIdxTreeFree(idxTree.firstPtr); break; } + default: + TCL_UNREACHABLE(); } return TCL_OK; diff --git a/generic/tclStrToD.c b/generic/tclStrToD.c index 69aafaa..fbb2184 100644 --- a/generic/tclStrToD.c +++ b/generic/tclStrToD.c @@ -672,7 +672,7 @@ TclParseNumber( state = SIGNUM; break; } - /* FALLTHROUGH */ + TCL_FALLTHROUGH(); case SIGNUM: /* @@ -768,7 +768,7 @@ TclParseNumber( acceptState = state; acceptPoint = p; acceptLen = len; - /* FALLTHROUGH */ + TCL_FALLTHROUGH(); case ZERO_O: zeroo: if (c == '0') { @@ -847,7 +847,7 @@ TclParseNumber( acceptState = state; acceptPoint = p; acceptLen = len; - /* FALLTHROUGH */ + TCL_FALLTHROUGH(); case ZERO_X: zerox: @@ -911,7 +911,7 @@ TclParseNumber( acceptState = state; acceptPoint = p; acceptLen = len; - /* FALLTHRU */ + TCL_FALLTHROUGH(); case ZERO_B: zerob: if (c == '0') { @@ -972,7 +972,7 @@ TclParseNumber( } state = DECIMAL; flags |= TCL_PARSE_INTEGER_ONLY; - /* FALLTHROUGH */ + TCL_FALLTHROUGH(); case DECIMAL: /* @@ -1024,7 +1024,7 @@ TclParseNumber( state = EXPONENT_START; break; } - /* FALLTHROUGH */ + TCL_FALLTHROUGH(); case LEADING_RADIX_POINT: if (c == '0') { @@ -1066,7 +1066,7 @@ TclParseNumber( state = EXPONENT_SIGNUM; break; } - /* FALLTHROUGH */ + TCL_FALLTHROUGH(); case EXPONENT_SIGNUM: /* @@ -1186,7 +1186,7 @@ TclParseNumber( state = sNANFINISH; break; } - /* FALLTHROUGH */ + TCL_FALLTHROUGH(); case sNANPAREN: if (TclIsSpaceProcM(c)) { break; @@ -1515,7 +1515,7 @@ TclParseNumber( #endif case INITIAL: /* This case only to silence compiler warning. */ - Tcl_Panic("TclParseNumber: state INITIAL can't happen here"); + TCL_UNREACHABLE(); } } @@ -2312,22 +2312,28 @@ NormalizeRightward( Tcl_WideUInt w = *wPtr; if (!(w & (Tcl_WideUInt) 0xFFFFFFFF)) { - w >>= 32; rv += 32; + w >>= 32; + rv += 32; } if (!(w & (Tcl_WideUInt) 0xFFFF)) { - w >>= 16; rv += 16; + w >>= 16; + rv += 16; } if (!(w & (Tcl_WideUInt) 0xFF)) { - w >>= 8; rv += 8; + w >>= 8; + rv += 8; } if (!(w & (Tcl_WideUInt) 0xF)) { - w >>= 4; rv += 4; + w >>= 4; + rv += 4; } if (!(w & 0x3)) { - w >>= 2; rv += 2; + w >>= 2; + rv += 2; } if (!(w & 0x1)) { - w >>= 1; ++rv; + w >>= 1; + ++rv; } *wPtr = w; return rv; @@ -3175,7 +3181,9 @@ ShorteningInt64Conversion( if (b < S) { b = 10 * b; - ++m2plus; ++m2minus; ++m5; + ++m2plus; + ++m2minus; + ++m5; ilim = ilim1; --k; } @@ -3554,7 +3562,9 @@ ShorteningBignumConversionPowD( if ((err == MP_OKAY) && (b.used <= sd)) { err = mp_mul_d(&b, 10, &b); - ++m2plus; ++m2minus; ++m5; + ++m2plus; + ++m2minus; + ++m5; ilim = ilim1; --k; } @@ -3594,7 +3604,8 @@ ShorteningBignumConversionPowD( if (b.used > sd+1 || digit >= 10) { Tcl_Panic("wrong digit!"); } - --b.used; mp_clamp(&b); + --b.used; + mp_clamp(&b); } /* @@ -4570,9 +4581,11 @@ TclDoubleDigits( */ if (b2 >= s2 && s2 > 0) { - b2 -= s2; s2 = 0; + b2 -= s2; + s2 = 0; } else if (s2 >= b2 && b2 > 0) { - s2 -= b2; b2 = 0; + s2 -= b2; + b2 = 0; } if (s5+1 < N_LOG2POW5 && s2+1 + log2pow5[s5+1] < 64) { diff --git a/generic/tclStringObj.c b/generic/tclStringObj.c index 7964142..2b0fbd7 100644 --- a/generic/tclStringObj.c +++ b/generic/tclStringObj.c @@ -2165,7 +2165,6 @@ Tcl_AppendFormatToObj( } case 'u': - /* FALLTHRU */ case 'd': case 'o': case 'p': @@ -2773,7 +2772,7 @@ AppendPrintfToObjVA( if (sizeof(size_t) == sizeof(Tcl_WideInt)) { size = 2; } - /* FALLTHRU */ + TCL_FALLTHROUGH(); case 'c': case 'i': case 'u': @@ -2868,7 +2867,7 @@ AppendPrintfToObjVA( break; case 'h': size = -1; - /* FALLTHRU */ + TCL_FALLTHROUGH(); default: p++; } @@ -3272,7 +3271,8 @@ TclStringCat( } while (--oc); } else { /* Result will be concat of string reps. Pre-size it. */ - ov = objv; oc = objc; + ov = objv; + oc = objc; do { Tcl_Obj *pendingPtr = NULL; @@ -3356,7 +3356,8 @@ TclStringCat( return objv[first]; } - objv += first; objc = (last - first + 1); + objv += first; + objc = (last - first + 1); inPlace = (flags & TCL_STRING_IN_PLACE) && !Tcl_IsShared(*objv); if (binary) { @@ -3371,7 +3372,8 @@ TclStringCat( if (inPlace) { Tcl_Size start = 0; - objResultPtr = *objv++; objc--; + objResultPtr = *objv++; + objc--; (void)Tcl_GetBytesFromObj(NULL, objResultPtr, &start); dst = Tcl_SetByteArrayLength(objResultPtr, length) + start; } else { @@ -3401,7 +3403,8 @@ TclStringCat( if (inPlace) { Tcl_Size start; - objResultPtr = *objv++; objc--; + objResultPtr = *objv++; + objc--; /* Ugly interface! Force resize of the unicode array. */ (void)Tcl_GetUnicodeFromObj(objResultPtr, &start); @@ -3452,7 +3455,8 @@ TclStringCat( if (inPlace) { Tcl_Size start; - objResultPtr = *objv++; objc--; + objResultPtr = *objv++; + objc--; (void)TclGetStringFromObj(objResultPtr, &start); if (0 == Tcl_AttemptSetObjLength(objResultPtr, length)) { diff --git a/generic/tclTest.c b/generic/tclTest.c index 72ed211..ebc859a 100644 --- a/generic/tclTest.c +++ b/generic/tclTest.c @@ -8765,7 +8765,7 @@ TestLutilCmd( Tcl_SetObjResult(interp, Tcl_NewIntObj(0)); break; } - /* FALLTHRU */ + TCL_FALLTHROUGH(); case LUTIL_DIFFINDEX: nCmp = nL1 <= nL2 ? nL1 : nL2; for (i = 0; i < nCmp; ++i) { diff --git a/generic/tclTimer.c b/generic/tclTimer.c index 5ffb29b..86c1f2c 100644 --- a/generic/tclTimer.c +++ b/generic/tclTimer.c @@ -979,7 +979,7 @@ Tcl_AfterObjCmd( } break; default: - Tcl_Panic("Tcl_AfterObjCmd: bad subcommand index to afterSubCmds"); + TCL_UNREACHABLE(); } return TCL_OK; } diff --git a/generic/tclTrace.c b/generic/tclTrace.c index f396245..e43eba8 100644 --- a/generic/tclTrace.c +++ b/generic/tclTrace.c @@ -250,9 +250,9 @@ Tcl_TraceObjCmd( return TCL_ERROR; } return traceSubCmds[typeIndex](interp, optionIndex, objc, objv); - break; } - + default: + TCL_UNREACHABLE(); } return TCL_OK; } @@ -344,6 +344,8 @@ TraceExecutionObjCmd( case TRACE_EXEC_LEAVE_STEP: flags |= TCL_TRACE_LEAVE_DURING_EXEC; break; + default: + TCL_UNREACHABLE(); } } command = TclGetStringFromObj(objv[5], &length); @@ -500,6 +502,8 @@ TraceExecutionObjCmd( Tcl_SetObjResult(interp, resultListPtr); break; } + default: + TCL_UNREACHABLE(); } return TCL_OK; } @@ -580,6 +584,8 @@ TraceCommandObjCmd( case TRACE_CMD_DELETE: flags |= TCL_TRACE_DELETE; break; + default: + TCL_UNREACHABLE(); } } @@ -694,6 +700,8 @@ TraceCommandObjCmd( Tcl_SetObjResult(interp, resultListPtr); break; } + default: + TCL_UNREACHABLE(); } return TCL_OK; } @@ -785,6 +793,8 @@ TraceVariableObjCmd( case TRACE_VAR_WRITE: flags |= TCL_TRACE_WRITES; break; + default: + TCL_UNREACHABLE(); } } command = TclGetStringFromObj(objv[5], &length); @@ -878,6 +888,8 @@ TraceVariableObjCmd( Tcl_SetObjResult(interp, resultListPtr); break; } + default: + TCL_UNREACHABLE(); } return TCL_OK; } diff --git a/generic/tclUtil.c b/generic/tclUtil.c index 385a966..2626f65 100644 --- a/generic/tclUtil.c +++ b/generic/tclUtil.c @@ -1133,7 +1133,7 @@ TclScanElement( preferEscape = 1; break; #else - /* FLOW THROUGH */ + TCL_FALLTHROUGH(); #endif /* COMPAT */ case '[': /* TYPE_SUBS */ case '$': /* TYPE_SUBS */ @@ -4451,7 +4451,7 @@ TclReToGlob( case '\\': case '*': case '[': case ']': case '?': /* Only add \ where necessary for glob */ *dsStr++ = '\\'; - /* fall through */ + TCL_FALLTHROUGH(); default: *dsStr++ = *p; break; @@ -4532,7 +4532,7 @@ TclReToGlob( /* Only add \ where necessary for glob */ *dsStr++ = '\\'; anchorLeft = 0; /* prevent exact match */ - /* fall through */ + TCL_FALLTHROUGH(); case '{': case '}': case '(': case ')': case '+': case '.': case '|': case '^': case '$': *dsStr++ = *p; diff --git a/generic/tclVar.c b/generic/tclVar.c index a94744f..53538df 100644 --- a/generic/tclVar.c +++ b/generic/tclVar.c @@ -3917,6 +3917,8 @@ ArrayNamesCmd( return TCL_ERROR; } break; + default: + TCL_UNREACHABLE(); } if (matched == 0) { continue; @@ -6948,10 +6950,10 @@ ArrayDefaultCmd( SetArrayDefault(varPtr, NULL); } return TCL_OK; - } - /* Unreached */ - return TCL_ERROR; + default: + TCL_UNREACHABLE(); + } } /* diff --git a/generic/tclZipfs.c b/generic/tclZipfs.c index b59a091..7530cc2 100644 --- a/generic/tclZipfs.c +++ b/generic/tclZipfs.c @@ -4257,6 +4257,8 @@ ZipFSListObjCmd( return TCL_ERROR; } break; + default: + TCL_UNREACHABLE(); } } else if (objc == 2) { pattern = TclGetString(objv[1]); diff --git a/generic/tclZlib.c b/generic/tclZlib.c index 4bf2e61..538a943 100644 --- a/generic/tclZlib.c +++ b/generic/tclZlib.c @@ -395,9 +395,7 @@ ConvertErrorToList( */ default: - TclNewLiteralStringObj(objv[2], "UNKNOWN"); - TclNewIntObj(objv[3], code); - return Tcl_NewListObj(4, objv); + TCL_UNREACHABLE(); } } @@ -2105,10 +2103,10 @@ ZlibCmd( return TCL_ERROR; } switch (option) { - case 0: + case 0: // -header headerDictObj = objv[i + 1]; break; - case 1: + case 1: // -level if (Tcl_GetIntFromObj(interp, objv[i + 1], &level) != TCL_OK) { return TCL_ERROR; @@ -2118,6 +2116,8 @@ ZlibCmd( goto badLevel; } break; + default: + TCL_UNREACHABLE(); } } return Tcl_ZlibDeflate(interp, TCL_ZLIB_FORMAT_GZIP, objv[2], level, @@ -2179,7 +2179,7 @@ ZlibCmd( return TCL_ERROR; } switch (option) { - case 0: + case 0: // -buffersize if (TclGetWideIntFromObj(interp, objv[i + 1], &wideLen) != TCL_OK) { return TCL_ERROR; @@ -2190,10 +2190,12 @@ ZlibCmd( } buffersize = wideLen; break; - case 1: + case 1: // -headerVar headerVarObj = objv[i + 1]; TclNewObj(headerDictObj); break; + default: + TCL_UNREACHABLE(); } } if (Tcl_ZlibInflate(interp, TCL_ZLIB_FORMAT_GZIP, objv[2], @@ -2215,9 +2217,10 @@ ZlibCmd( case CMD_PUSH: /* push mode channel options... * -> channel */ return ZlibPushSubcmd(interp, objc, objv); - } - return TCL_ERROR; + default: // Should be no other options + TCL_UNREACHABLE(); + } badLevel: Tcl_SetObjResult(interp, Tcl_NewStringObj( @@ -2340,7 +2343,7 @@ ZlibStreamSubcmd( format = TCL_ZLIB_FORMAT_GZIP; break; default: - Tcl_Panic("should be unreachable"); + TCL_UNREACHABLE(); } /* @@ -2472,7 +2475,7 @@ ZlibPushSubcmd( format = TCL_ZLIB_FORMAT_GZIP; break; default: - Tcl_Panic("should be unreachable"); + TCL_UNREACHABLE(); } if (TclGetChannelFromObj(interp, objv[3], &chan, &chanMode, 0) != TCL_OK) { @@ -2555,6 +2558,8 @@ ZlibPushSubcmd( } compDictObj = objv[i]; break; + default: + TCL_UNREACHABLE(); } } @@ -2708,9 +2713,9 @@ ZlibStreamCmd( return TCL_ERROR; } return Tcl_ZlibStreamReset(zstream); + default: + TCL_UNREACHABLE(); } - - return TCL_OK; } static int @@ -2787,6 +2792,8 @@ ZlibStreamAddCmd( } compDictObj = objv[++i]; break; + default: + TCL_UNREACHABLE(); } if (flush == -2) { @@ -2895,6 +2902,8 @@ ZlibStreamPutCmd( } compDictObj = objv[++i]; break; + default: + TCL_UNREACHABLE(); } if (flush == -2) { Tcl_SetObjResult(interp, Tcl_NewStringObj( diff --git a/unix/tclUnixChan.c b/unix/tclUnixChan.c index ac4734c..7a44b1e 100644 --- a/unix/tclUnixChan.c +++ b/unix/tclUnixChan.c @@ -1507,15 +1507,15 @@ TtyGetAttributes( parity = 'n'; #ifdef PAREXT switch ((int) (iostate.c_cflag & (PARENB | PARODD | PAREXT))) { - case PARENB : parity = 'e'; break; - case PARENB | PARODD : parity = 'o'; break; - case PARENB | PAREXT : parity = 's'; break; - case PARENB | PARODD | PAREXT : parity = 'm'; break; + case PARENB : parity = 'e'; break; + case PARENB | PARODD : parity = 'o'; break; + case PARENB | PAREXT : parity = 's'; break; + case PARENB | PARODD | PAREXT : parity = 'm'; break; } #else /* !PAREXT */ switch ((int) (iostate.c_cflag & (PARENB | PARODD))) { - case PARENB : parity = 'e'; break; - case PARENB | PARODD : parity = 'o'; break; + case PARENB : parity = 'e'; break; + case PARENB | PARODD : parity = 'o'; break; } #endif /* PAREXT */ diff --git a/win/tclWinPipe.c b/win/tclWinPipe.c index 2942ea1..2aa6d98 100644 --- a/win/tclWinPipe.c +++ b/win/tclWinPipe.c @@ -3457,7 +3457,7 @@ TclPipeThreadStopSignal( SetEvent(evControl); *pipeTIPtr = NULL; - /* FALLTHRU */ + TCL_FALLTHROUGH(); case PTI_STATE_DOWN: return 1; -- cgit v0.12