[Bug c++/97195] construct_at on a union member is not a constant expression

2020-10-13 Thread jakub at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=97195

Jakub Jelinek  changed:

   What|Removed |Added

 Status|ASSIGNED|RESOLVED
 Resolution|--- |FIXED

--- Comment #5 from Jakub Jelinek  ---
Fixed.

[Bug c++/97195] construct_at on a union member is not a constant expression

2020-10-05 Thread cvs-commit at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=97195

--- Comment #4 from CVS Commits  ---
The releases/gcc-10 branch has been updated by Jakub Jelinek
:

https://gcc.gnu.org/g:355b42c5d9d58d266829d2e44528f7a5ca0eae37

commit r10-8852-g355b42c5d9d58d266829d2e44528f7a5ca0eae37
Author: Jakub Jelinek 
Date:   Thu Oct 1 11:16:44 2020 +0200

c++: Handle std::construct_at on automatic vars during constant evaluation
[PR97195]

As mentioned in the PR, we only support due to a bug in constant
expressions
std::construct_at on non-automatic variables, because we VERIFY_CONSTANT
the
second argument of placement new, which fails verification if it is an
address of an automatic variable.
The following patch fixes it by not performing that verification, the
placement new evaluation later on will verify it after it is dereferenced.

2020-10-01  Jakub Jelinek  

PR c++/97195
* constexpr.c (cxx_eval_call_expression): Don't VERIFY_CONSTANT the
second argument.

* g++.dg/cpp2a/constexpr-new14.C: New test.

(cherry picked from commit 2805fcb32660bc0cdcd5ba54310f1f02651e039f)

[Bug c++/97195] construct_at on a union member is not a constant expression

2020-10-01 Thread cvs-commit at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=97195

--- Comment #3 from CVS Commits  ---
The master branch has been updated by Jakub Jelinek :

https://gcc.gnu.org/g:2805fcb32660bc0cdcd5ba54310f1f02651e039f

commit r11-3581-g2805fcb32660bc0cdcd5ba54310f1f02651e039f
Author: Jakub Jelinek 
Date:   Thu Oct 1 11:16:44 2020 +0200

c++: Handle std::construct_at on automatic vars during constant evaluation
[PR97195]

As mentioned in the PR, we only support due to a bug in constant
expressions
std::construct_at on non-automatic variables, because we VERIFY_CONSTANT
the
second argument of placement new, which fails verification if it is an
address of an automatic variable.
The following patch fixes it by not performing that verification, the
placement new evaluation later on will verify it after it is dereferenced.

2020-10-01  Jakub Jelinek  

PR c++/97195
* constexpr.c (cxx_eval_call_expression): Don't VERIFY_CONSTANT the
second argument.

* g++.dg/cpp2a/constexpr-new14.C: New test.

[Bug c++/97195] construct_at on a union member is not a constant expression

2020-09-29 Thread jakub at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=97195

Jakub Jelinek  changed:

   What|Removed |Added

   Assignee|unassigned at gcc dot gnu.org  |jakub at gcc dot gnu.org
 Status|NEW |ASSIGNED

--- Comment #2 from Jakub Jelinek  ---
Created attachment 49290
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=49290=edit
gcc11-pr97195.patch

Untested fix.

[Bug c++/97195] construct_at on a union member is not a constant expression

2020-09-28 Thread redi at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=97195

Jonathan Wakely  changed:

   What|Removed |Added

 Status|UNCONFIRMED |NEW
 Ever confirmed|0   |1
   Last reconfirmed||2020-09-28
 CC||jakub at gcc dot gnu.org

[Bug c++/97195] construct_at on a union member is not a constant expression

2020-09-27 Thread david at doublewise dot net via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=97195

David Stone  changed:

   What|Removed |Added

 CC||david at doublewise dot net

--- Comment #1 from David Stone  ---
This is actually a broader bug in construct_at, unrelated to unions:


```
#include 

constexpr bool test() {
int a = 5;
std::construct_at(
,
-1
);
return true;
}
constexpr bool b = test();
```

is also rejected. See it live: https://godbolt.org/z/KWK8n1

The real problem here appears to be that std::construct_at is not a constant
expression for values with non-constant addresses. The following code, for
example, is accepted:

```
#include 

struct S {
constexpr S() {
std::construct_at(
,
-1
);
}

int m;
};

constexpr S s;
```

See it live: https://godbolt.org/z/Wdx9Kx