view clang/test/SemaCXX/warn-range-loop-analysis-trivially-copyable.cpp @ 222:81f6424ef0e3 llvm-original

LLVM original branch
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Sun, 18 Jul 2021 22:10:01 +0900 (2021-07-18)
parents 0572611fdcc8
children
line wrap: on
line source
// RUN: %clang_cc1 -fsyntax-only -std=c++11 -Wloop-analysis -verify %s
// RUN: %clang_cc1 -fsyntax-only -std=c++11 -Wrange-loop-analysis -verify %s

void test_POD_64_bytes() {
  struct Record {
    char a[64];
  };

  Record records[8];
  for (const auto r : records)
    (void)r;
}

void test_POD_65_bytes() {
  struct Record {
    char a[65];
  };

  // expected-warning@+3 {{loop variable 'r' creates a copy from type 'const Record'}}
  // expected-note@+2 {{use reference type 'const Record &' to prevent copying}}
  Record records[8];
  for (const auto r : records)
    (void)r;
}

void test_TriviallyCopyable_64_bytes() {
  struct Record {
    Record() {}
    char a[64];
  };

  Record records[8];
  for (const auto r : records)
    (void)r;
}

void test_TriviallyCopyable_65_bytes() {
  struct Record {
    Record() {}
    char a[65];
  };

  // expected-warning@+3 {{loop variable 'r' creates a copy from type 'const Record'}}
  // expected-note@+2 {{use reference type 'const Record &' to prevent copying}}
  Record records[8];
  for (const auto r : records)
    (void)r;
}

void test_NonTriviallyCopyable() {
  struct Record {
    Record() {}
    ~Record() {}
    volatile int a;
    int b;
  };

  // expected-warning@+3 {{loop variable 'r' creates a copy from type 'const Record'}}
  // expected-note@+2 {{use reference type 'const Record &' to prevent copying}}
  Record records[8];
  for (const auto r : records)
    (void)r;
}

void test_TrivialABI_64_bytes() {
  struct [[clang::trivial_abi]] Record {
    Record() {}
    ~Record() {}
    char a[64];
  };

  Record records[8];
  for (const auto r : records)
    (void)r;
}

void test_TrivialABI_65_bytes() {
  struct [[clang::trivial_abi]] Record {
    Record() {}
    ~Record() {}
    char a[65];
  };

  // expected-warning@+3 {{loop variable 'r' creates a copy from type 'const Record'}}
  // expected-note@+2 {{use reference type 'const Record &' to prevent copying}}
  Record records[8];
  for (const auto r : records)
    (void)r;
}