https://gcc.gnu.org/bugzilla/show_bug.cgi?id=121434
Bug ID: 121434
Summary: spurious -Wsequence-point warning
Product: gcc
Version: 15.1.1
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: jylefort at gmail dot com
Target Milestone: ---
```
#include <format>
#include <string>
#include <tuple>
inline std::string whatever (int index, auto&& arg) {
return std::format("{}: {}", index, std::forward<decltype(arg)>(arg));
}
template <class... Args>
inline auto foo (Args&&... args) {
int index = 0;
return std::tuple{whatever(index++, std::forward<Args>(args))...};
}
inline void bar() {
foo(123, "xyz");
}
```
Compile with:
```
$ g++ -std=c++23 -Wall -Wextra -c test.cxx
test.cxx: In instantiation of ‘auto foo(Args&& ...) [with Args = {int, const
char (&)[4]}]’:
test.cxx:16:8: required from here
16 | foo(123, "xyz");
| ~~~^~~~~~~~~~~~
test.cxx:12:69: warning: operation on ‘index’ may be undefined
[-Wsequence-point]
12 | return std::tuple{whatever(index++, std::forward<Args>(args))...};
| ^
test.cxx:12:69: warning: operation on ‘index’ may be undefined
[-Wsequence-point]
```
This warning is spurious. In a braced-init-list, the order of evaluation of the
param pack expansion is indeed defined.
```
Within the initializer-list of a braced-init-list, the initializer-clauses,
including any that result from pack expansions, are evaluated in the order in
which they appear. That is, every value computation and side effect associated
with a given initializer-clause is sequenced before every value computation and
side effect associated with any initializer-clause that follows it in the
comma-separated list of the initializer-list. [ Note: This evaluation ordering
holds regardless of the semantics of the initialization; for example, it
applies when the elements of the initializer-list are interpreted as arguments
of a constructor call, even though ordinarily there are no sequencing
constraints on the arguments of a call. — end note ]
```
Source: https://timsong-cpp.github.io/cppwp/n4659/dcl.init.list#4