public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug c/111421] New: constexpr not working with array subscript
@ 2023-09-15 5:36 malekwryyy at gmail dot com
2023-09-15 16:54 ` [Bug c/111421] " joseph at codesourcery dot com
` (3 more replies)
0 siblings, 4 replies; 5+ messages in thread
From: malekwryyy at gmail dot com @ 2023-09-15 5:36 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=111421
Bug ID: 111421
Summary: constexpr not working with array subscript
Product: gcc
Version: 13.2.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c
Assignee: unassigned at gcc dot gnu.org
Reporter: malekwryyy at gmail dot com
Target Milestone: ---
Created attachment 55903
--> https://gcc.gnu.org/bugzilla/attachment.cgi?id=55903&action=edit
the c program that results in the error
compiled with: -std=c2x -Wall -Wextra
When trying to subscript a constexpr array, the compiler says the expression is
not constant.
I would expect if the index is an integer literal (or a constexpr integer) then
the resulting expression should still be constant.
I tried this with -std=c2x and -std=gnu2x
// program start
typedef struct S { int i; } S;
constexpr int a = (constexpr S){.i = 3}.i; // works as expected
constexpr int b = ( &(constexpr S){.i = 3} )->i; // works as expected
constexpr int y = (constexpr int[]){3}[0]; // doesn't work. Compiler says
expression not constant
int main()
{
return 0;
}
// program end
the compiler error I get is:
<source>:7:19: error: initializer element is not constant
7 | constexpr int y = (constexpr int[]){3}[0]; // doesn't work. Compiler
says expression not constant
| ^
<source>:7:15: warning: 'y' defined but not used [-Wunused-const-variable=]
7 | constexpr int y = (constexpr int[]){3}[0]; // doesn't work. Compiler
says expression not constant
| ^
<source>:5:15: warning: 'b' defined but not used [-Wunused-const-variable=]
5 | constexpr int b = ( &(constexpr S){.i = 3} )->i; // works as expected
| ^
<source>:3:15: warning: 'a' defined but not used [-Wunused-const-variable=]
3 | constexpr int a = (constexpr S){.i = 3}.i; // works as expected
| ^
Compiler returned: 1
^ permalink raw reply [flat|nested] 5+ messages in thread
* [Bug c/111421] constexpr not working with array subscript
2023-09-15 5:36 [Bug c/111421] New: constexpr not working with array subscript malekwryyy at gmail dot com
@ 2023-09-15 16:54 ` joseph at codesourcery dot com
2023-09-15 17:03 ` mpolacek at gcc dot gnu.org
` (2 subsequent siblings)
3 siblings, 0 replies; 5+ messages in thread
From: joseph at codesourcery dot com @ 2023-09-15 16:54 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=111421
--- Comment #1 from joseph at codesourcery dot com <joseph at codesourcery dot com> ---
See the definitions of "named constant" and "compound literal constant".
Array element accesses aren't allowed, and the example you have with "->"
shouldn't be accepted either (although the standard rules for
implementation-defined constant expressions probably allow implementations
to accept such an example if they so choose).
^ permalink raw reply [flat|nested] 5+ messages in thread
* [Bug c/111421] constexpr not working with array subscript
2023-09-15 5:36 [Bug c/111421] New: constexpr not working with array subscript malekwryyy at gmail dot com
2023-09-15 16:54 ` [Bug c/111421] " joseph at codesourcery dot com
@ 2023-09-15 17:03 ` mpolacek at gcc dot gnu.org
2023-09-15 17:09 ` malekwryyy at gmail dot com
2023-09-15 17:21 ` joseph at codesourcery dot com
3 siblings, 0 replies; 5+ messages in thread
From: mpolacek at gcc dot gnu.org @ 2023-09-15 17:03 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=111421
Marek Polacek <mpolacek at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |mpolacek at gcc dot gnu.org
Status|UNCONFIRMED |RESOLVED
Resolution|--- |INVALID
--- Comment #2 from Marek Polacek <mpolacek at gcc dot gnu.org> ---
Invalid then.
^ permalink raw reply [flat|nested] 5+ messages in thread
* [Bug c/111421] constexpr not working with array subscript
2023-09-15 5:36 [Bug c/111421] New: constexpr not working with array subscript malekwryyy at gmail dot com
2023-09-15 16:54 ` [Bug c/111421] " joseph at codesourcery dot com
2023-09-15 17:03 ` mpolacek at gcc dot gnu.org
@ 2023-09-15 17:09 ` malekwryyy at gmail dot com
2023-09-15 17:21 ` joseph at codesourcery dot com
3 siblings, 0 replies; 5+ messages in thread
From: malekwryyy at gmail dot com @ 2023-09-15 17:09 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=111421
--- Comment #3 from Abdulmalek Almkainzi <malekwryyy at gmail dot com> ---
(In reply to joseph@codesourcery.com from comment #1)
> See the definitions of "named constant" and "compound literal constant".
> Array element accesses aren't allowed, and the example you have with "->"
> shouldn't be accepted either (although the standard rules for
> implementation-defined constant expressions probably allow implementations
> to accept such an example if they so choose).
Alright, I see how this is not a GCC bug and instead part of the standard.
But may I ask how this is even the case? the expression is constant and can be
evaluated at compile time.
^ permalink raw reply [flat|nested] 5+ messages in thread
* [Bug c/111421] constexpr not working with array subscript
2023-09-15 5:36 [Bug c/111421] New: constexpr not working with array subscript malekwryyy at gmail dot com
` (2 preceding siblings ...)
2023-09-15 17:09 ` malekwryyy at gmail dot com
@ 2023-09-15 17:21 ` joseph at codesourcery dot com
3 siblings, 0 replies; 5+ messages in thread
From: joseph at codesourcery dot com @ 2023-09-15 17:21 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=111421
--- Comment #4 from joseph at codesourcery dot com <joseph at codesourcery dot com> ---
The definition of constexpr in C2x is intentionally minimal, with
potential for future expansion in subsequent standard revisions.
Allowing array element accesses would run into needing an appropriate
definition of exactly what cases are allowed and don't count as accessing
the value of an object (presumably including requiring the array element
index itself to be an integer constant expression within range for the
array in question).
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2023-09-15 17:21 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-09-15 5:36 [Bug c/111421] New: constexpr not working with array subscript malekwryyy at gmail dot com
2023-09-15 16:54 ` [Bug c/111421] " joseph at codesourcery dot com
2023-09-15 17:03 ` mpolacek at gcc dot gnu.org
2023-09-15 17:09 ` malekwryyy at gmail dot com
2023-09-15 17:21 ` joseph at codesourcery dot com
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).