[llvm-bugs] [Bug 44556] New: -Wrange-loop-analysis is too strict in templates

via llvm-bugs llvm-bugs at lists.llvm.org
Wed Jan 15 08:01:39 PST 2020


            Bug ID: 44556
           Summary: -Wrange-loop-analysis is too strict in templates
           Product: clang
           Version: trunk
          Hardware: All
                OS: All
            Status: NEW
          Severity: normal
          Priority: P
         Component: Frontend
          Assignee: unassignedclangbugs at nondot.org
          Reporter: aaronpuchert at alice-dsl.net
                CC: llvm-bugs at lists.llvm.org, neeilans at live.com,
                    richard-llvm at metafoo.co.uk

The warning -Wrange-loop-analysis diagnoses two issues:

* When the return value of the iterator's operator* is a reference type, but it
is captured by value: this means we've made an unnecessary copy.
* When the return value of the iterator's operator* is not a reference type,
but is captured by reference: this is fine, but suggests there is no copy when
in fact there is one. (Well, because of RVO there might actually be no copy.)

Unfortunately the warning flips in template code:

struct Rng {
    struct iterator {
        int operator*() const;
        iterator& operator++();
        bool operator!=(const iterator&) const;
    iterator begin() const;
    iterator end() const;

struct X {
    X() = default;
    X(const X&);

template<typename T>
void f(const T& t) {
    // Variant 1.
    for (const auto& _ : t)    // Warning from (1).
    // Variant 2.
    for (const auto _ : t)     // Warning from (2).

void g()
    X array[3];
    f(array);    // (1)
    f(Rng{});    // (2)

This means however I write f, there will always be a warning, although the
first variant is actually correct. I think that we should either not warn about
the second issue, or drop the warning when template-dependent types are
involved. However, we should in my opinion always warn about the first issue.

You are receiving this mail because:
You are on the CC list for the bug.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-bugs/attachments/20200115/659ae917/attachment.html>

More information about the llvm-bugs mailing list