Hello Patrick, On Wed, May 03 2023, Patrick Palka via Gcc-patches wrote: > [...] > > Subject: [PATCH] c++: potentiality of templated memfn call [PR109480] > > Here we're incorrectly deeming the templated call a.g() inside b's > initializer as potentially constant, despite g being non-constexpr, > which leads to us wastefully instantiating the initializer ahead of time, > which incidentally tiggers a bug in access checking deferral (to be > fixed by the subsequent patch). > > This patch fixes this by calling get_fns earlier during CALL_EXPR > potentiality checking so that we're able to extract a FUNCTION_DECL out > of a templated member function call (whose overall is typically a > COMPONENT_REF) and to the usual checking if the called function is > constexpr etc. > > In passing, I noticed potential_constant_expression_1's special handling > of the object argument of a non-static member function call is effectively > the same as the generic argument handling a few lines later. So this > patch just gets rid of this special handling; otherwise we'd have to adapt > it to handle templated versions of such calls. > > PR c++/109480 > > gcc/cp/ChangeLog: > > * constexpr.cc (potential_constant_expression_1) <case CALL_EXPR>: > Reorganize to call get_fns sooner. Remove special handling of > the object argument of a non-static member function call. Remove > dead store to 'fun'. >
This patch makes g++ no longer accept the following, complaining that get_subsys is non-constexpr (with just -std=c++17 -S), which is of course auto-reduced from a much larger source file from Ceph: ----------------------------------- 8< ----------------------------------- struct { void get_subsys(); } PriorSet_dpp; struct PriorSet { template <typename> PriorSet(); }; template <typename> PriorSet::PriorSet() { [](auto cctX) { cctX.template should_gather<PriorSet_dpp.get_subsys()>; }; } ----------------------------------- 8< ----------------------------------- I assume that is intentional and am actually somewhat surprised it was accepted before, but can you please confirm? Thanks, Martin