-
Notifications
You must be signed in to change notification settings - Fork 11.5k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[Sema] Improve -Wrange-loop-analysis warnings.
No longer generate a diagnostic when a small trivially copyable type is used without a reference. Before the test looked for a POD type and had no size restriction. Since the range-based for loop is only available in C++11 and POD types are trivially copyable in C++11 it's not required to test for a POD type. Since copying a large object will be expensive its size has been restricted. 64 bytes is a common size of a cache line and if the object is aligned the copy will be cheap. No performance impact testing has been done. Differential Revision: https://reviews.llvm.org/D72212
- Loading branch information
Showing
3 changed files
with
109 additions
and
4 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
89 changes: 89 additions & 0 deletions
89
clang/test/SemaCXX/warn-range-loop-analysis-trivially-copyable.cpp
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,89 @@ | ||
// 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' of type 'const Record' 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' of type 'const Record' 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' of type 'const Record' 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' of type 'const Record' 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; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters