From fd797a9746cd6407d4f826b79dba4c0fe01f668e Mon Sep 17 00:00:00 2001 From: "Stephan T. Lavavej" Date: Mon, 17 Jun 2024 22:34:01 -0700 Subject: [PATCH] Fix warning C26818 about `switch` statements needing `default` cases (#4715) --- stl/inc/chrono | 2 + stl/inc/format | 15 ++++++ stl/inc/regex | 3 ++ stl/inc/xlocmon | 23 ++++++++- stl/inc/xloctime | 1 + tests/std/rulesets/stl.ruleset | 2 + .../test.compile.pass.cpp | 47 +++++++++++++++++++ 7 files changed, 92 insertions(+), 1 deletion(-) diff --git a/stl/inc/chrono b/stl/inc/chrono index 8b3a2cbd2d..4a8e089c91 100644 --- a/stl/inc/chrono +++ b/stl/inc/chrono @@ -4177,6 +4177,8 @@ namespace chrono { case '+': ++_First; break; + default: + break; } // For a regular offset hh[mm], simply read four digits, with the option of an EOF or non-digit after diff --git a/stl/inc/format b/stl/inc/format index bf50772212..b734cb23b9 100644 --- a/stl/inc/format +++ b/stl/inc/format @@ -276,6 +276,8 @@ _NODISCARD constexpr _Decode_result _Decode_utf(const char* _First, const return {_First + 1, false}; } break; + default: + break; } // mask out the "value bits" in the leading byte, @@ -292,6 +294,9 @@ _NODISCARD constexpr _Decode_result _Decode_utf(const char* _First, const case 4: _Val &= 0b111u; break; + default: + _STL_UNREACHABLE; // can't happen, see how the value of _Num_bytes is determined + break; } for (int _Idx = 1; _Idx < _Num_bytes; ++_Idx) { @@ -1258,6 +1263,8 @@ _NODISCARD constexpr const _CharT* _Parse_align( case '^': _Parsed_align = _Fmt_align::_Center; break; + default: + break; } if (_Parsed_align != _Fmt_align::_None) { @@ -2849,6 +2856,8 @@ _NODISCARD _OutputIt _Write_integral( case 'o': _Base = 8; break; + default: + break; } // long long -1 representation in binary is 64 bits + sign @@ -4447,6 +4456,8 @@ _NODISCARD constexpr const _CharT* _Parse_range_specs( _Callbacks._On_type(_Maybe_type); ++_Begin; break; + default: + break; } return _Begin; @@ -4534,6 +4545,10 @@ public: } break; + + default: + _STL_UNREACHABLE; // can't happen, we've handled all possible outputs from _Parse_range_specs() + break; } if (_Specs._No_brackets) { diff --git a/stl/inc/regex b/stl/inc/regex index 9061d5b54f..587c3b6055 100644 --- a/stl/inc/regex +++ b/stl/inc/regex @@ -3922,6 +3922,9 @@ void _Parser<_FwdIt, _Elem, _RxTraits>::_Trans() { // map character to meta-char } break; + + default: + break; } } diff --git a/stl/inc/xlocmon b/stl/inc/xlocmon index c40f3a4ab8..3c7d924644 100644 --- a/stl/inc/xlocmon +++ b/stl/inc/xlocmon @@ -567,7 +567,15 @@ private: if (_Pattern.field[_Off] == money_base::space && !_Seen) { _Bad = true; // fail if no space seen } - } // parse optional space + + break; + } + + default: + _STL_ASSERT(false, "Invalid money_base::pattern, see N4981 [locale.moneypunct.general]/1: " + "In the field member of a pattern object, each value symbol, sign, value, " + "and either space or none appears exactly once."); + break; } // switch } @@ -787,6 +795,12 @@ private: } break; + + default: + _STL_ASSERT(false, "Invalid money_base::pattern, see N4981 [locale.moneypunct.general]/1: " + "In the field member of a pattern object, each value symbol, sign, value, " + "and either space or none appears exactly once."); + break; } } @@ -840,6 +854,13 @@ private: _Dest = _Rep(_Dest, _Fill, _Fillcount); _Fillcount = 0; } + break; + + default: + _STL_ASSERT(false, "Invalid money_base::pattern, see N4981 [locale.moneypunct.general]/1: " + "In the field member of a pattern object, each value symbol, sign, value, " + "and either space or none appears exactly once."); + break; } } diff --git a/stl/inc/xloctime b/stl/inc/xloctime index a0fd7f336c..52da0f5bae 100644 --- a/stl/inc/xloctime +++ b/stl/inc/xloctime @@ -563,6 +563,7 @@ protected: default: _State |= ios_base::failbit; // unknown specifier + break; } if (_First == _Last) { diff --git a/tests/std/rulesets/stl.ruleset b/tests/std/rulesets/stl.ruleset index 7859a44da8..d75eee85b0 100644 --- a/tests/std/rulesets/stl.ruleset +++ b/tests/std/rulesets/stl.ruleset @@ -7,5 +7,7 @@ + + diff --git a/tests/std/tests/GH_002094_cpp_core_guidelines/test.compile.pass.cpp b/tests/std/tests/GH_002094_cpp_core_guidelines/test.compile.pass.cpp index 1132aa1235..ac0cb8599f 100644 --- a/tests/std/tests/GH_002094_cpp_core_guidelines/test.compile.pass.cpp +++ b/tests/std/tests/GH_002094_cpp_core_guidelines/test.compile.pass.cpp @@ -2,3 +2,50 @@ // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception #include <__msvc_all_public_headers.hpp> + +using namespace std; + +void instantiate_regex_machinery() { + const regex r{R"(.+meow.+)"}; + assert(regex_match("homeowner", r)); +} + +#if _HAS_CXX20 +void instantiate_chrono_parse_machinery() { + istringstream iss{"10:02:07"}; + chrono::seconds s{}; + iss >> chrono::parse("%H:%M:%S", s); + assert(s == 36127s); +} +#endif // ^^^ _HAS_CXX20 ^^^ + +#if _HAS_CXX23 +template +struct WrappedVector : vector { + using vector::vector; +}; + +template +struct std::formatter, char> { +public: + template + constexpr auto parse(ParseContext& ctx) { + return underlying.parse(ctx); + } + + template + auto format(const WrappedVector& rng, FormatContext& ctx) const { + return underlying.format(rng, ctx); + } + +private: + range_formatter underlying; +}; + +void instantiate_range_formatter_machinery() { + const WrappedVector v{11, 22, 33, 44}; + assert(format("{}", v) == "[11, 22, 33, 44]"); + assert(format("{:}", v) == "[11, 22, 33, 44]"); + assert(format("{:n}", v) == "11, 22, 33, 44"); +} +#endif // ^^^ _HAS_CXX23 ^^^