https://gcc.gnu.org/bugzilla/show_bug.cgi?id=111284
--- Comment #9 from Patrick Palka <ppalka at gcc dot gnu.org> --- (In reply to Jakub Jelinek from comment #8) > Created attachment 57648 [details] > gcc14-pr111284.patch > > So, I've tried to fix this by constexpr evaluating the arguments passed to > PARM_DECLs with TREE_ADDRESSABLE types in the caller as lvalues rather than > rvaluea and later, if we try to evaluate the PARM_DECL in the callee as lval, > lookup the value and use that, if it is rval constexpr evaluate again as > rvalue. > There is a complication for qualified type, say if the argument is const in > the callee and caller is passing reference to non-const, adjust_temp_type > can't handle that when it isn't a rvalue. Interesting, hopefully this fixes the std::string testcases in PR111258 and related PRs? And perhaps the following augmented testcase from this PR with a constexpr dtor that checks valid(): void non_constant(); struct self_locator { self_locator() = default; constexpr self_locator(const self_locator&) noexcept : this_{this} {} constexpr self_locator& operator=(const self_locator&) noexcept { return *this; } constexpr bool valid() const noexcept { return this_ == this; } constexpr ~self_locator() { if (!valid()) non_constant(); } self_locator *this_ = this; }; constexpr bool demonstrator(self_locator x) noexcept { return x.valid(); } static_assert(demonstrator(self_locator{}), ""); static_assert([](self_locator x){ return x.valid(); }(self_locator{}), "");