jyknight added a comment.

In D129488#3761478 <https://reviews.llvm.org/D129488#3761478>, @ilya-biryukov 
wrote:

> In D129488#3761398 <https://reviews.llvm.org/D129488#3761398>, @jyknight 
> wrote:
>
>> I believe this should print `fn=14 fn2=14`. I don't see how we can get that 
>> by special-casing calls to `std::source_location::current`, and indeed, with 
>> this version of the patch, the program instead prints `fn=14 fn2=9`.
>
> There is another issue in Clang that prevents it from producing correct 
> results with this patch. We should not evaluate immediate calls inside 
> default arguments of immediate function parameters as they are deemed to be 
> inside the immediate function context 
> <https://eel.is/c++draft/expr.const#14.1>. Clang currently evaluates these 
> calls as all parameter scopes are `PotentiallyEvaluatedIfUsed` and 
> `ImmediateFunctionContext` is a different value inside the same enumeration :)

OK...So...

If the correct rule is that consteval functions must be immediately evaluated 
even when used in a default arg of a non-consteval function (rather than 
deferring evaluation to the callsite, as would otherwise be the rule for 
default args!), then GCC's behavior for "fn3" in your example 
https://gcc.godbolt.org/z/P1x8PGsh6 makes sense. And, yea, also Clang's 
_current_ behavior for `current()` makes sense! Because `current` is not 
actually generating the source location itself -- the //actual// source 
location is coming from a builtin call in a default arg of `current()`...it's 
only a wrapper, just like `fn()` is a wrapper around `current()`.

But, "makes sense" (from implementation point of view) doesn't mean 
"useful"...which is why you're adding a special case for it. And why GCC also 
did.

This is really quite awful.

The more I look at this, the more I feel like, if all the above behaviors are 
correct, source_location::current() simply shouldn't be marked consteval at 
all. If it was constexpr, instead, it'd work great _without_ needing any 
special-casing, because the "must evaluate immediately upon seeing function 
definition even in default arg position" wouldn't apply to it. And that's the 
behavior we //want// from it!


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D129488/new/

https://reviews.llvm.org/D129488

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to