c++: Extend -Wrange-loop-construct for binding-to-temp [PR94695]
authorMarek Polacek <polacek@redhat.com>
Tue, 10 Nov 2020 02:15:33 +0000 (21:15 -0500)
committerMarek Polacek <polacek@redhat.com>
Sat, 21 Nov 2020 21:20:16 +0000 (16:20 -0500)
commitc51e31a06f2c740c55852a683aa7ffdc20417362
tree8e9427d27fc773b8f550807538315fc9bc9e6160
parent6f20c42cc162ac3725584547ab4933bae4c78665
c++: Extend -Wrange-loop-construct for binding-to-temp [PR94695]

This patch finishes the second half of -Wrange-loop-construct I promised
to implement: it warns when a loop variable in a range-based for-loop is
initialized with a value of a different type resulting in a copy.  For
instance:

  int arr[10];
  for (const double &x : arr) { ... }

where in every iteration we have to create and destroy a temporary value
of type double, to which we bind the reference.  This could negatively
impact performance.

As per Clang, this doesn't warn when the range returns a copy, hence the
glvalue_p check.

gcc/ChangeLog:

PR c++/94695
* doc/invoke.texi: Update the -Wrange-loop-construct description.

gcc/cp/ChangeLog:

PR c++/94695
* parser.c (warn_for_range_copy): Warn when the loop variable is
initialized with a value of a different type resulting in a copy.

gcc/testsuite/ChangeLog:

PR c++/94695
* g++.dg/warn/Wrange-loop-construct2.C: New test.
gcc/cp/parser.c
gcc/doc/invoke.texi
gcc/testsuite/g++.dg/warn/Wrange-loop-construct2.C [new file with mode: 0644]