On Fri, Dec 19, 2025 at 1:28 AM Jakub Jelinek <[email protected]> wrote: > > Hi! > > This is something Jonathan has asked for recently. E.g. in the recent > libstdc++ r16-6177 random.tcc changes, there was > if constexpr (__d <= 32) > return __generate_canonical_any<_RealT, uint64_t, __d>(__urng); > else > { > #if defined(__SIZEOF_INT128__) > static_assert(__d <= 64, > "irregular RNG with float precision >64 is not supported"); > return __generate_canonical_any< > _RealT, unsigned __int128, __d>(__urng); > #else > static_assert(false, "irregular RNG with float precision" > " >32 requires __int128 support"); > #endif > } > and when we hit there the static_assert, we don't get just an error about > that, but also a -Wreturn-type warning in the same function because that > path falls through to the end of function without returning a value. > But a function with a failed static_assert is erroneous and will never > fall through to the end. We could treat failed static_assert in functions > as __builtin_unreachable (), but I think it doesn't matter where exactly > in a function static_assert(false); appears, so this patch just suppresses > -Wreturn-type warning in that function instead. > > Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?
This fixes PR 91388 (though not PR 119149). Thanks, Andrew Pinski > > 2025-12-19 Jakub Jelinek <[email protected]> > > * semantics.cc (finish_static_assert): Suppress -Wreturn-type warnings > in functions with failed assertions. > > * g++.dg/cpp1z/static_assert1.C: New test. > > --- gcc/cp/semantics.cc.jj 2025-12-13 09:54:13.142393769 +0100 > +++ gcc/cp/semantics.cc 2025-12-18 17:59:15.961112063 +0100 > @@ -12927,6 +12927,16 @@ finish_static_assert (tree condition, tr > error_at (cloc, "static assertion failed: %.*s", len, msg); > > diagnose_failing_condition (bad, cloc, show_expr_p); > + > + /* Suppress -Wreturn-type for functions with failed static_asserts. > + Otherwise templates like: > + if constexpr (whatever) > + return something (args); > + else > + static_assert (false, "explanation"); > + get a useless extra -Wreturn-type warning. */ > + if (current_function_decl) > + suppress_warning (current_function_decl, OPT_Wreturn_type); > } > else if (condition && condition != error_mark_node) > { > --- gcc/testsuite/g++.dg/cpp1z/static_assert1.C.jj 2025-12-18 > 18:03:17.867763452 +0100 > +++ gcc/testsuite/g++.dg/cpp1z/static_assert1.C 2025-12-18 18:03:00.642073110 > +0100 > @@ -0,0 +1,16 @@ > +// Make sure we don't emit -Wreturn-type in functions with failed > static_asserts. > +// { dg-do compile { target c++17 } } > + > +template <int N> > +int > +foo () > +{ > + if constexpr (N <= 42) > + return N; > + else > + static_assert (false, "too high N"); // { dg-error "too high N" } > +} // { dg-bogus "no return > statement in function returning non-void" } > + > +int a = foo <0> (); > +int b = foo <42> (); > +int c = foo <100> (); > > Jakub >
