view clang/test/SemaCXX/warn-range-loop-analysis-trivially-copyable.cpp @ 266:00f31e85ec16 default tip

Added tag current for changeset 31d058e83c98
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Sat, 14 Oct 2023 10:13:55 +0900
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;
}