public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug c++/108317] New: g++ is unable to capture vector-extended variables
@ 2023-01-06 14:11 janezz55 at gmail dot com
  2023-01-06 14:11 ` [Bug c++/108317] " janezz55 at gmail dot com
                   ` (3 more replies)
  0 siblings, 4 replies; 5+ messages in thread
From: janezz55 at gmail dot com @ 2023-01-06 14:11 UTC (permalink / raw)
  To: gcc-bugs

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

            Bug ID: 108317
           Summary: g++ is unable to capture vector-extended variables
           Product: gcc
           Version: 12.2.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: janezz55 at gmail dot com
  Target Milestone: ---

Created attachment 54204
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=54204&action=edit
sample file demonstrating the bug

g++ will be unable to capture v_ in the code sample below, but clang++ will do
so just fine. 

  template <std::size_t M>
  auto operator+(pint<T, M> const& o) const noexcept
  {
    pint r;

    [&]<auto ...I>(std::index_sequence<I...>) noexcept
    {
      bool c;

      (
        [&]() noexcept
        {
          if constexpr(I)
          {
            r.v_[I] = c + v_[I] + (I < M ? o.v_[I] : T{});
            c = c ? r.v_[I] <= v_[I] : r.v_[I] < v_[I];
          }
          else
          {
            c = (r.v_[I] = v_[I] + o.v_[I]) < v_[I];
          }
        }(),
        ...
      );
    }(std::make_index_sequence<N>());

    return r;
  }

error: 'v_' was not declared in this scope

^ permalink raw reply	[flat|nested] 5+ messages in thread

* [Bug c++/108317] g++ is unable to capture vector-extended variables
  2023-01-06 14:11 [Bug c++/108317] New: g++ is unable to capture vector-extended variables janezz55 at gmail dot com
@ 2023-01-06 14:11 ` janezz55 at gmail dot com
  2023-01-06 18:04 ` [Bug c++/108317] dependent vector field is not causing this to be captured for fold expression inside a if constexpr block pinskia at gcc dot gnu.org
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 5+ messages in thread
From: janezz55 at gmail dot com @ 2023-01-06 14:11 UTC (permalink / raw)
  To: gcc-bugs

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

--- Comment #1 from Janez Zemva <janezz55 at gmail dot com> ---
Created attachment 54205
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=54205&action=edit
sample file demonstrating the bug

^ permalink raw reply	[flat|nested] 5+ messages in thread

* [Bug c++/108317] dependent vector field is not causing this to be captured for fold expression inside a if constexpr block
  2023-01-06 14:11 [Bug c++/108317] New: g++ is unable to capture vector-extended variables janezz55 at gmail dot com
  2023-01-06 14:11 ` [Bug c++/108317] " janezz55 at gmail dot com
@ 2023-01-06 18:04 ` pinskia at gcc dot gnu.org
  2023-01-06 18:07 ` [Bug c++/108317] dependent vector field is not causing field of this not to be found " pinskia at gcc dot gnu.org
  2023-01-06 18:10 ` pinskia at gcc dot gnu.org
  3 siblings, 0 replies; 5+ messages in thread
From: pinskia at gcc dot gnu.org @ 2023-01-06 18:04 UTC (permalink / raw)
  To: gcc-bugs

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

Andrew Pinski <pinskia at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Target|#1 SMP PREEMPT_DYNAMIC Sat, |
                   |31 Dec 2022 17:40:35 +0000  |
     Ever confirmed|0                           |1
             Status|UNCONFIRMED                 |NEW
   Last reconfirmed|                            |2023-01-06
            Summary|g++ is unable to capture    |dependent vector field is
                   |vector-extended variables   |not causing this to be
                   |                            |captured for fold
                   |                            |expression inside a if
                   |                            |constexpr block
               Host|#1 SMP PREEMPT_DYNAMIC Sat, |
                   |31 Dec 2022 17:40:35 +0000  |

--- Comment #2 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
Reduced testcase:
template <typename T>
struct pint
{
  T __attribute__ ((vector_size (2 * sizeof(T)))) v_;

  void f(pint const& o)
  {
    [&]<int ...I>()
    {
      (
        [&]() noexcept
        {
          if constexpr(I)
          {
            v_[I];
          }
        }(),
        ...
      );
    }.template operator()<0, 1>();
  }

};

int main()
{
  using D = pint<int>;

  D a;
  D b;

  a.f(b);

  return 0;
}

^ permalink raw reply	[flat|nested] 5+ messages in thread

* [Bug c++/108317] dependent vector field is not causing field of this not to be found for fold expression inside a if constexpr block
  2023-01-06 14:11 [Bug c++/108317] New: g++ is unable to capture vector-extended variables janezz55 at gmail dot com
  2023-01-06 14:11 ` [Bug c++/108317] " janezz55 at gmail dot com
  2023-01-06 18:04 ` [Bug c++/108317] dependent vector field is not causing this to be captured for fold expression inside a if constexpr block pinskia at gcc dot gnu.org
@ 2023-01-06 18:07 ` pinskia at gcc dot gnu.org
  2023-01-06 18:10 ` pinskia at gcc dot gnu.org
  3 siblings, 0 replies; 5+ messages in thread
From: pinskia at gcc dot gnu.org @ 2023-01-06 18:07 UTC (permalink / raw)
  To: gcc-bugs

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

Andrew Pinski <pinskia at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
            Summary|dependent vector field is   |dependent vector field is
                   |not causing this to be      |not causing field of this
                   |captured for fold           |not to be found for fold
                   |expression inside a if      |expression inside a if
                   |constexpr block             |constexpr block

--- Comment #3 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
Simple workaround is to do:


          if constexpr(I)
          {
            r.v_[I] = c + this->v_[I] + (I < M ? o.v_[I] : T{});
            c = c ? r.v_[I] <= this->v_[I] : r.v_[I] < this->v_[I];
          }
          else
          {
            c = (r.v_[I] = this->v_[I] + o.v_[I]) < this->v_[I];
          }

^ permalink raw reply	[flat|nested] 5+ messages in thread

* [Bug c++/108317] dependent vector field is not causing field of this not to be found for fold expression inside a if constexpr block
  2023-01-06 14:11 [Bug c++/108317] New: g++ is unable to capture vector-extended variables janezz55 at gmail dot com
                   ` (2 preceding siblings ...)
  2023-01-06 18:07 ` [Bug c++/108317] dependent vector field is not causing field of this not to be found " pinskia at gcc dot gnu.org
@ 2023-01-06 18:10 ` pinskia at gcc dot gnu.org
  3 siblings, 0 replies; 5+ messages in thread
From: pinskia at gcc dot gnu.org @ 2023-01-06 18:10 UTC (permalink / raw)
  To: gcc-bugs

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

--- Comment #4 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
I should mention that <0> works but <0,1> fails. That might get a hint to a
person fixing the issue of what is going wrong inside the compiler.

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2023-01-06 18:10 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-01-06 14:11 [Bug c++/108317] New: g++ is unable to capture vector-extended variables janezz55 at gmail dot com
2023-01-06 14:11 ` [Bug c++/108317] " janezz55 at gmail dot com
2023-01-06 18:04 ` [Bug c++/108317] dependent vector field is not causing this to be captured for fold expression inside a if constexpr block pinskia at gcc dot gnu.org
2023-01-06 18:07 ` [Bug c++/108317] dependent vector field is not causing field of this not to be found " pinskia at gcc dot gnu.org
2023-01-06 18:10 ` pinskia at gcc dot gnu.org

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).