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

            Bug ID: 87413
           Summary: strlen accepted in array declaration
           Product: gcc
           Version: 8.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: bernd.edlinger at hotmail dot de
  Target Milestone: ---

$ cat test.c
#include <string.h>
char x[strlen("test")];
int test ()
{
  return sizeof(x);
}
$ gcc -Wall -S test.c
test.c:2:6: error: variably modified 'x' at file scope
2 | char x[strlen("test")];
  |      ^

which is okay.
But:

$ gcc -S -x c++ -Wall test.c
$ cat test.s
        .file   "test.c"
        .text
        .globl  x
        .bss
        .type   x, @object
        .size   x, 4
x:
        .zero   4
        .text
        .globl  _Z4testv
        .type   _Z4testv, @function
_Z4testv:
.LFB0:
        .cfi_startproc
        pushq   %rbp
        .cfi_def_cfa_offset 16
        .cfi_offset 6, -16
        movq    %rsp, %rbp
        .cfi_def_cfa_register 6
        movl    $4, %eax
        popq    %rbp
        .cfi_def_cfa 7, 8
        ret
        .cfi_endproc

This was previously rejected:
$ gcc-4.8 -x c++ -S test.c
test.c:2:22: error: array bound is not an integer constant before ‘]’ token
 char x[strlen("test")];
                      ^
test.c: In function ‘int test()’:
test.c:5:17: error: ‘x’ was not declared in this scope
   return sizeof(x);
                 ^

I think this should be invalid.

Interestingly, this modified example was accepted as C and rejected as C++
by gcc-4.8
$ cat test1.c
char x[__builtin_strlen("test")];
int test ()
{
  return sizeof(x);
}
$ gcc-4.8 -S test.c
$ gcc-4.8 -x c++ -S test.c
test.c:2:22: error: array bound is not an integer constant before ‘]’ token
 char x[strlen("test")];
                      ^
test.c: In function ‘int test()’:
test.c:5:17: error: ‘x’ was not declared in this scope
   return sizeof(x);
                 ^

Reply via email to