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

            Bug ID: 119797
           Summary: Incorrect Warning about Array Subscript out of Range
           Product: gcc
           Version: 14.2.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: christoph at muppetnet dot net
  Target Milestone: ---
            Target: ARM

When compiling the following code for ARM with -Wall -Wextra -O2
-mcpu=cortex-m4  we get an unexpected warning.

#include <cstdint>

template<uint8_t N>
uint32_t Test(uint8_t r)
{
    if (r >= 16)
    {
        return 2U;
    }
    else
    {
        return N;
    }
}

const uint32_t BUG[] = { 0x0000000U, 0x0000001U, 0x0000002U };

bool Bug(uint8_t r)
{
    const uint32_t s = Test<0U>(r);
    const uint32_t e = Test<1U>(r);

    const uint32_t cs = BUG[r];
    const uint32_t ce = BUG[r];

    if ((s != cs) || (e != ce))
    {
        return false;
    }
    else
    {
        return true;
    }
}

The compiler complains about r being our of range. The "16" here is related to
the "if (r >= 16)". Changing the if results also in a different warning shown.

<source>: In function 'bool Bug(uint8_t)':
<source>:23:30: warning: array subscript 16 is above array bounds of 'const
uint32_t [3]' {aka 'const unsigned int [3]'} [-Warray-bounds=]
   23 |     const uint32_t cs = BUG[r];
      |                         ~~~~~^
<source>:16:16: note: while referencing 'BUG'
   16 | const uint32_t BUG[] = { 0x0000000U, 0x0000001U, 0x0000002U };
      |                ^~~
Compiler returned: 0

The issue can be seen here https://godbolt.org/z/j6WozvMb3

Reply via email to