[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