https://gcc.gnu.org/bugzilla/show_bug.cgi?id=70723

Richard Biener <rguenth at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Keywords|                            |missed-optimization
             Status|UNCONFIRMED                 |NEW
   Last reconfirmed|                            |2016-04-19
     Ever confirmed|0                           |1

--- Comment #1 from Richard Biener <rguenth at gcc dot gnu.org> ---
The initializer of erasedTypeVTable is not statically available but involves
runtime computation:

;; Function void __static_initialization_and_destruction_0(int, int) (null)
;; enabled by -tree-original


if (__initialize_p == 1)
  {
    if (__priority == 65535)
      {
        <<cleanup_point <<< Unknown tree: expr_stmt
  erasedTypeVTable.dtor = {anonymous}::<lambda(void*)>::operator void
(*)(void*) (&TARGET_EXPR <D.5974, {}>) >>>>>;
        <<< Unknown tree: expr_stmt
  <<< Unknown tree: void_cst >>> >>>;
      }
  }


;; Function (static initializers for t.C) (null)
;; enabled by -tree-original


<<cleanup_point <<< Unknown tree: expr_stmt
  __static_initialization_and_destruction_0 (1, 65535) >>>>>;


thats probably because the lambda is not evaluated in a constexpr context.
If I make erasedTypeVTable a constexpr I get

t.C: In instantiation of ‘constexpr const {anonymous}::ErasedTypeVTable
{anonymous}::erasedTypeVTable<{anonymous}::myType>’:
t.C:36:7:   required from here
t.C:20:41: error: call to non-constexpr function
‘{anonymous}::<lambda(void*)>::operator void (*)(void*)() const’
       static constexpr ErasedTypeVTable erasedTypeVTable = {
                                         ^~~~~~~~~~~~~~~~

not sure how I would make the lambda a constexpr.


There is no pass in GCC that would try to turn the runtime initialization
into static init again (optimizing the runtime initializers and parsing
them back to static initializers).

Reply via email to