public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug c++/110828] New: union constexpr dtor not constexpr when used in member array
@ 2023-07-27 10:06 gccbugbjorn at fahller dot se
  2023-07-27 14:22 ` [Bug c++/110828] " ppalka at gcc dot gnu.org
                   ` (2 more replies)
  0 siblings, 3 replies; 4+ messages in thread
From: gccbugbjorn at fahller dot se @ 2023-07-27 10:06 UTC (permalink / raw)
  To: gcc-bugs

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

            Bug ID: 110828
           Summary: union constexpr dtor not constexpr when used in member
                    array
           Product: gcc
           Version: 13.1.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: gccbugbjorn at fahller dot se
  Target Milestone: ---

The following code does not compile with g++ 13.1 or g++ trunk
82c2a34b2f2c1a06eff672eba2e447b53f35d7b0

union type {
    constexpr type(){}
    constexpr ~type() {}
    int t;
};

struct S
{
    constexpr S() = default;
    constexpr bool f() const { return true;}
private:
    type v[1];
};


static_assert(S{}.f());

The error message is:
source.cpp:16:20: error: non-constant condition for static assertion
   16 | static_assert(S{}.f());
      |               ~~~~~^~
source.cpp:16:23:   in 'constexpr' expansion of '(&<anonymous>)->S::~S()'
source.cpp:7:8: error: '(((type*)(&<anonymous>.S::v)) != 0)' is not a constant
expression
    7 | struct S
      |        ^

Two simple changes can each make it compile.

1. Comment out the constexpr destructor for 'type'
2. Remove [1] from the declaration of member variable S::v such that it is not
an array.

Link to compiler explorer: https://godbolt.org/z/q3KcKrPh1

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

* [Bug c++/110828] union constexpr dtor not constexpr when used in member array
  2023-07-27 10:06 [Bug c++/110828] New: union constexpr dtor not constexpr when used in member array gccbugbjorn at fahller dot se
@ 2023-07-27 14:22 ` ppalka at gcc dot gnu.org
  2023-07-27 16:25 ` gccbugbjorn at fahller dot se
  2023-07-27 17:54 ` pinskia at gcc dot gnu.org
  2 siblings, 0 replies; 4+ messages in thread
From: ppalka at gcc dot gnu.org @ 2023-07-27 14:22 UTC (permalink / raw)
  To: gcc-bugs

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

Patrick Palka <ppalka at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |ppalka at gcc dot gnu.org

--- Comment #1 from Patrick Palka <ppalka at gcc dot gnu.org> ---
Does it work if you move the static_assert into a function scope? If so then
this is probably a dup of PR85944.

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

* [Bug c++/110828] union constexpr dtor not constexpr when used in member array
  2023-07-27 10:06 [Bug c++/110828] New: union constexpr dtor not constexpr when used in member array gccbugbjorn at fahller dot se
  2023-07-27 14:22 ` [Bug c++/110828] " ppalka at gcc dot gnu.org
@ 2023-07-27 16:25 ` gccbugbjorn at fahller dot se
  2023-07-27 17:54 ` pinskia at gcc dot gnu.org
  2 siblings, 0 replies; 4+ messages in thread
From: gccbugbjorn at fahller dot se @ 2023-07-27 16:25 UTC (permalink / raw)
  To: gcc-bugs

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

--- Comment #2 from Björn Fahller <gccbugbjorn at fahller dot se> ---
If I write it in the same way in a function, it compiles.

consteval auto f()
{
    return S{}.f();
}

constexpr auto b = f();


However, if I break it into a constexpr object S s; and return s.f(), it does
not compile, this time because the construction of 's' fails because it refers
to an unititialized variable, regardless of whether the member is an array or
not.

union type {
    constexpr type(){}
    constexpr ~type() {}
    int t;
};

struct S
{
    constexpr S() {}
    constexpr bool f() const { return true;}
    type v{};
};

consteval auto f()
{
    constexpr S s;
    return s.f();
}

constexpr auto b = f();

https://godbolt.org/z/68zY6ecxs

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

* [Bug c++/110828] union constexpr dtor not constexpr when used in member array
  2023-07-27 10:06 [Bug c++/110828] New: union constexpr dtor not constexpr when used in member array gccbugbjorn at fahller dot se
  2023-07-27 14:22 ` [Bug c++/110828] " ppalka at gcc dot gnu.org
  2023-07-27 16:25 ` gccbugbjorn at fahller dot se
@ 2023-07-27 17:54 ` pinskia at gcc dot gnu.org
  2 siblings, 0 replies; 4+ messages in thread
From: pinskia at gcc dot gnu.org @ 2023-07-27 17:54 UTC (permalink / raw)
  To: gcc-bugs

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

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

           What    |Removed                     |Added
----------------------------------------------------------------------------
         Resolution|---                         |DUPLICATE
             Status|UNCONFIRMED                 |RESOLVED

--- Comment #3 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
(In reply to Patrick Palka from comment #1)
> Does it work if you move the static_assert into a function scope? If so then
> this is probably a dup of PR85944.

Yes it does work with:
```
void f1() {
static_assert(S{}.f());
}
```
So yes it is a dup.

*** This bug has been marked as a duplicate of bug 85944 ***

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

end of thread, other threads:[~2023-07-27 17:54 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-07-27 10:06 [Bug c++/110828] New: union constexpr dtor not constexpr when used in member array gccbugbjorn at fahller dot se
2023-07-27 14:22 ` [Bug c++/110828] " ppalka at gcc dot gnu.org
2023-07-27 16:25 ` gccbugbjorn at fahller dot se
2023-07-27 17:54 ` 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).