On Thu, 5 Feb 2026 at 11:11, Tomasz Kaminski <[email protected]> wrote:
>
>
>
> On Thu, Feb 5, 2026 at 11:58 AM Tomasz Kaminski <[email protected]> wrote:
>>
>>
>>
>> On Thu, Feb 5, 2026 at 11:55 AM Tomasz Kaminski <[email protected]> wrote:
>>>
>>>
>>>
>>> On Thu, Feb 5, 2026 at 11:35 AM Jonathan Wakely <[email protected]> wrote:
>>>>
>>>> The new constructor added for Contracts support should be explicit, and
>>>> only needs to be defined when contracts are enabled by -fcontracts.
>>>>
>>>> It might as well be marked noexcept too. And the comment on the friend
>>>> declaration isn't accurate, the friend needs access to the private
>>>> constructor, not the __impl type.
>>>>
>>>> libstdc++-v3/ChangeLog:
>>>>
>>>>         * include/std/source_location (source_location(const void*)):
>>>>         Make new constructor explicit and gate on __glibcxx_contracts.
>>>>         * testsuite/18_support/contracts/includes.cc: Move to...
>>>>         * testsuite/18_support/contracts/srcloc.cc: ...here. Test for
>>>>         ambiguity caused by new constructor.
>>>> ---
>>>>
>>>> Tested x86_64-linux.
>>>
>>> While adding explicit is desired why this constructor accepts void*
>>> (and thus causes issues), instead of __impl*. This would reduce
>>> the risk of ambiguities even more.
>>> And if contranct_violation can access the constructor, it can
>>> also  access __impl.
>>
>> We could either cast to impl in function:
>>    std::source_location location() const noexcept {
>>       return std::source_location (_M_src_loc_ptr);
>>     }
>> Or store _M_src_loc_ptr as source_location::impl*.
>
> I think casting inside contract_handler is a much cleaner solution,
> it is up to contract_handler to know that _M_src_loc_ptr void* points to 
> source_location::__impl.
> I contrast, is very fishy for source_location(void*) constructor to assume 
> that any void*
> the pointer it got is pointing to __impl.
>
> Or even better, instead of constructor,  this should be static 
> _S_from_impl_ptr(const void*)
> private function. If the type is part of the name of the function, it can 
> accept void* argument.

We already have such a function:

    // [support.srcloc.cons], creation
    static consteval source_location
    current(__builtin_ret_type __p = __builtin_source_location()) noexcept
    {
      source_location __ret;
      __ret._M_impl = static_cast <const __impl*>(__p);
      return __ret;
    }

So the contract_violation type could just call that to construct a
source_location from its _M_src_loc_ptr.

Then we don't need a private constructor at all.

Reply via email to