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

            Bug ID: 116377
           Summary: Warnings emit repeatedly when inlining occurs
           Product: gcc
           Version: 15.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c
          Assignee: unassigned at gcc dot gnu.org
          Reporter: peter0x44 at disroot dot org
  Target Milestone: ---

https://gcc.godbolt.org/z/njehnfTdW

The following testcase:

static int foo(char* p) {
     __builtin_strncpy(p, p, 1);
     foo(p);
     return 0;
}

void bar() {
     char c[0];
     foo(c);
}

Emits this warning spam:
<source>: In function 'foo':
<source>:2:12: warning: infinite recursion detected [-Winfinite-recursion]
    2 | static int foo(char* p) {
      |            ^~~
<source>:4:6: note: recursive call
    4 |      foo(p);
      |      ^~~~~~
<source>: In function 'foo.isra':
<source>:3:6: warning: '__builtin_strncpy' source argument is the same as
destination [-Wrestrict]
    3 |      __builtin_strncpy(p, p, 1);
      |      ^~~~~~~~~~~~~~~~~~~~~~~~~~
In function 'foo',
    inlined from 'foo.isra' at <source>:4:6:
<source>:3:6: warning: '__builtin_strncpy' source argument is the same as
destination [-Wrestrict]
    3 |      __builtin_strncpy(p, p, 1);
      |      ^~~~~~~~~~~~~~~~~~~~~~~~~~
In function 'foo',
    inlined from 'foo' at <source>:4:6,
    inlined from 'foo.isra' at <source>:4:6:
<source>:3:6: warning: '__builtin_strncpy' source argument is the same as
destination [-Wrestrict]
    3 |      __builtin_strncpy(p, p, 1);
      |      ^~~~~~~~~~~~~~~~~~~~~~~~~~
In function 'foo',
    inlined from 'foo' at <source>:4:6,
    inlined from 'foo' at <source>:4:6,
    inlined from 'foo.isra' at <source>:4:6:
<source>:3:6: warning: '__builtin_strncpy' source argument is the same as
destination [-Wrestrict]
    3 |      __builtin_strncpy(p, p, 1);
      |      ^~~~~~~~~~~~~~~~~~~~~~~~~~
In function 'foo',
    inlined from 'foo' at <source>:4:6,
    inlined from 'foo' at <source>:4:6,
    inlined from 'foo' at <source>:4:6,
    inlined from 'foo.isra' at <source>:4:6:
<source>:3:6: warning: '__builtin_strncpy' source argument is the same as
destination [-Wrestrict]
    3 |      __builtin_strncpy(p, p, 1);
      |      ^~~~~~~~~~~~~~~~~~~~~~~~~~
In function 'foo',
    inlined from 'foo' at <source>:4:6,
    inlined from 'foo' at <source>:4:6,
    inlined from 'foo' at <source>:4:6,
    inlined from 'foo' at <source>:4:6,
    inlined from 'foo.isra' at <source>:4:6:
<source>:3:6: warning: '__builtin_strncpy' source argument is the same as
destination [-Wrestrict]
    3 |      __builtin_strncpy(p, p, 1);
      |      ^~~~~~~~~~~~~~~~~~~~~~~~~~
In function 'foo',
    inlined from 'foo' at <source>:4:6,
    inlined from 'foo' at <source>:4:6,
    inlined from 'foo' at <source>:4:6,
    inlined from 'foo' at <source>:4:6,
    inlined from 'foo' at <source>:4:6,
    inlined from 'foo.isra' at <source>:4:6:
<source>:3:6: warning: '__builtin_strncpy' source argument is the same as
destination [-Wrestrict]
    3 |      __builtin_strncpy(p, p, 1);
      |      ^~~~~~~~~~~~~~~~~~~~~~~~~~
In function 'foo',
    inlined from 'foo' at <source>:4:6,
    inlined from 'foo' at <source>:4:6,
    inlined from 'foo' at <source>:4:6,
    inlined from 'foo' at <source>:4:6,
    inlined from 'foo' at <source>:4:6,
    inlined from 'foo' at <source>:4:6,
    inlined from 'foo.isra' at <source>:4:6:
<source>:3:6: warning: '__builtin_strncpy' source argument is the same as
destination [-Wrestrict]
    3 |      __builtin_strncpy(p, p, 1);
      |      ^~~~~~~~~~~~~~~~~~~~~~~~~~
In function 'foo',
    inlined from 'foo' at <source>:4:6,
    inlined from 'foo' at <source>:4:6,
    inlined from 'foo' at <source>:4:6,
    inlined from 'foo' at <source>:4:6,
    inlined from 'foo' at <source>:4:6,
    inlined from 'foo' at <source>:4:6,
    inlined from 'foo' at <source>:4:6,
    inlined from 'foo.isra' at <source>:4:6:
<source>:3:6: warning: '__builtin_strncpy' source argument is the same as
destination [-Wrestrict]
    3 |      __builtin_strncpy(p, p, 1);
      |      ^~~~~~~~~~~~~~~~~~~~~~~~~~
In function 'foo',
    inlined from 'bar' at <source>:10:6:
<source>:3:6: warning: '__builtin_strncpy' offset 0 is out of the bounds [0, 0]
of object 'c' with type 'char[0]' [-Warray-bounds=]
    3 |      __builtin_strncpy(p, p, 1);
      |      ^~~~~~~~~~~~~~~~~~~~~~~~~~
<source>: In function 'bar':
<source>:9:11: note: 'c' declared here
    9 |      char c[0];
      |           ^
Compiler returned: 0

This applies to both C and C++.

Reply via email to