[PATCH] D63960: [C++20] Add consteval-specific semantic for functions
Richard Smith - zygoloid via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Tue Oct 29 18:29:11 PDT 2019
rsmith added a comment.
In D63960#1712398 <https://reviews.llvm.org/D63960#1712398>, @Tyker wrote:
> The now that constexpr destructors are legal. The code in this patch need to be adapted, I have question about the following code.
>
> struct A {
> constexpr ~A() {}
> };
>
> consteval A f() {
> return A{};
> }
>
> void test() {
> A a;
> a = f(); // <-- here
> }
>
>
> At the point i marked.
> The invocation of f causes an immediate invocation (http://eel.is/c++draft/expr.const#12).
> Immediate invocation are full expression (http://eel.is/c++draft/intro.execution#5).
> Full expression resolve all there side-effects before evaluating the next full expression (http://eel.is/c++draft/intro.execution#9).
> The return value of f() is created inside the immediate invocation.
> So the destructor of the value returned by f() should be destroyed within the immediate evaluation.
> But that value is needed for the assignment operator.
> This seem contradictory. What have i misunderstood ? What should happen here ?
After desugaring, the above example looks like this:
a.operator=( <temporary materialization conversion>( <consteval full-expression>( f() ) ) );
That is: the temporary is materialized outside the immediate evaluation, so no `A` destructor should be run as part of evaluating that full-expression (the destructor is run in the enclosing full-expression). If the example were instead:
constexpr A g() {
return A {};
}
consteval A &id (A &&a) { return a; }
void test() {
A a;
a = id(g());
}
then we would have
a.operator=( <consteval full-expression>( id( <temporary materialization conversion>( g() ) ) ) );
... and now the `A` temporary should be destroyed inside the full-expression. This example is ill-formed because the `id` call is not a constant expression (because its evaluated value refers to an object with automatic storage duration).
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D63960/new/
https://reviews.llvm.org/D63960
More information about the cfe-commits
mailing list