Compiling the following code with g++ result in error. Command line to
reproduce the error is "arm-linux-gnueabi-g++ -c test.cpp", where test.cpp is
the file comprising the following lines:

struct T
{
   const void* ptr;
};

const struct T my_arr[] =
{
  { 0 },
  { my_arr+1 }    // Error at this line
};

Error is: "invalid use of non-lvalue array"

This error is reported only when compiling as C++ code. Compilation with gcc or
with "-xc" is successful.

I think that the code above perfectly meet C++ standard because:

1. According to 3.3.1p1, the point of declaration of my_arr is immediately
before "=". Thus, the name "my_arr" is properly introduced and can be used in
the initializer.

2. Expression "my_arr+1" should be treated as: Array-to-pointer conversion
(4.2p1), additive operator + (5.7p1). Resulting pointer does not exceed array
boundaries, so the expression is well-formed and it has legal result.

3. Whether "my_arr" is an lvalue or an rvalue expression is not important,
because array-to-pointer conversion is defined for lvalue and rvalue arrays
(4.2p1). Which makes error message irrelevant, because such use is valid.

4. However, I believe that expression "my_arr" is an lvalue expression because
it refers to an object (3.10p2). The fact that the object is const (i.e.
non-modifiable) doesn't make it non-lvalue.

Output of "arm-linux-gnueabi-g++ -v" is:

Using built-in specs.
Target: arm-none-linux-gnueabi
Configured with:
/home/toolbuilder/tools_build/build.arm-linux-gnueabi/gcc-4.1.1/configure
--target=arm-none-linux-gnueabi
--prefix=/usr/toolchain/arm-linux-gnueabi/gcc-4.1.1
--with-local-prefix=/usr/toolchain/arm-linux-gnueabi/gcc-4.1.1/local
--with-sysroot=/usr/toolchain/arm-linux-gnueabi/sysroot-arm11-linux-2.6.17.8-glibc-2.4
--enable-languages=c,c++ --enable-c99
--program-transform-name=s/.*/arm-linux-gnueabi-&-4.1.1/ --enable-shared
--enable-__cxa_atexit --disable-libunwind-exceptions --enable-threads=posix
--enable-symvers=gnu --enable-long-long --disable-cpp --with-gnu-as
--with-gnu-ld
--with-as=/usr/toolchain/arm-linux-gnueabi/bin/arm-linux-gnueabi-as
--with-ld=/usr/toolchain/arm-linux-gnueabi/bin/arm-linux-gnueabi-ld
--with-nm=/usr/toolchain/arm-linux-gnueabi/bin/arm-linux-gnueabi-nm
--with-objdump=/usr/toolchain/arm-linux-gnueabi/bin/arm-linux-gnueabi-objdump
--disable-nls --disable-multilib
Thread model: posix
gcc version 4.1.1


-- 
           Summary: Error reported on a legal source: "invalid use of non-
                    lvalue array" when array name is used in initializer
           Product: gcc
           Version: 4.1.1
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: igusarov at mail dot ru
 GCC build triplet: i386-unknown-freebsd5.4
  GCC host triplet: i386-unknown-freebsd5.4
GCC target triplet: arm-none-linux-gnueabi


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=33909

Reply via email to