1
    2
    3
    4
    5
    6
    7
    8
    9
   10
   11
   12
   13
   14
   15
   16
   17
   18
   19
   20
   21
   22
   23
   24
   25
   26
   27
   28
   29
   30
   31
   32
   33
   34
   35
   36
   37
   38

base / containers / adapters_nocompile.nc [blame]

// Copyright 2024 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// This is a "No Compile Test" suite.
// http://dev.chromium.org/developers/testing/no-compile-tests

#include "base/containers/adapters.h"
#include "base/containers/span.h"

#include <utility>
#include <vector>

namespace base {

void DanglingInRangeBasedForLoop() {
  // This is not safe prior to C++23, since the temporary vector does not have
  // its lifetime extended.
  for (int&& x : RangeAsRvalues(std::vector({1, 2, 3}))) {  // expected-error {{temporary implicitly bound to local reference will be destroyed at the end of the full-expression}}
    x *= x;
  }
  for (int& x : Reversed(std::vector({1, 2, 3}))) {  // expected-error {{temporary implicitly bound to local reference will be destroyed at the end of the full-expression}}
    x *= x;
  }
}

void RangeAsRvaluesRequiresNonBorrowedRange() {
  std::vector<int> v;
  RangeAsRvalues(v);  // expected-error {{no matching function for call to 'RangeAsRvalues'}}
}

void RangeAsRvaluesRequiresMutableRange() {
  // A non-mutable range can't be moved from.
  const std::vector<int> v;
  RangeAsRvalues(std::move(v));  // expected-error {{no matching function for call to 'RangeAsRvalues'}}
}

}  // namespace base