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).