summaryrefslogtreecommitdiffstats
path: root/clang/test
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2011-08-02 21:44:23 +0000
committerChris Lattner <sabre@nondot.org>2011-08-02 21:44:23 +0000
commitf51dae0378eeeb328ef2d39e41df73054937949c (patch)
treeca80a95ac4c2455718b708af76c12b21b1743d35 /clang/test
parent366bccefad05b369bb8ba004fd33a92a932a311b (diff)
downloadbcm5719-llvm-f51dae0378eeeb328ef2d39e41df73054937949c.tar.gz
bcm5719-llvm-f51dae0378eeeb328ef2d39e41df73054937949c.zip
disable array bounds overflow warning for cases where an array
has a single element. This disables the warning in cases where there is a clear bug, but this is really rare (who uses arrays with one element?) and it also silences a large class of false positive issues with C89 code that is using tail padding in structs. A better version of this patch would detect when an array is in a tail position in a struct, but at least patch fixes the huge false positives that are hitting postgres and other code. llvm-svn: 136724
Diffstat (limited to 'clang/test')
-rw-r--r--clang/test/SemaCXX/array-bounds.cpp23
1 files changed, 17 insertions, 6 deletions
diff --git a/clang/test/SemaCXX/array-bounds.cpp b/clang/test/SemaCXX/array-bounds.cpp
index 3bd6c35420d..044949200e0 100644
--- a/clang/test/SemaCXX/array-bounds.cpp
+++ b/clang/test/SemaCXX/array-bounds.cpp
@@ -24,8 +24,8 @@ void f1(int a[1]) {
int val = a[3]; // no warning for function argumnet
}
-void f2(const int (&a)[1]) { // expected-note {{declared here}}
- int val = a[3]; // expected-warning {{array index of '3' indexes past the end of an array (that contains 1 elements)}}
+void f2(const int (&a)[2]) { // expected-note {{declared here}}
+ int val = a[3]; // expected-warning {{array index of '3' indexes past the end of an array (that contains 2 elements)}}
}
void test() {
@@ -42,8 +42,8 @@ void test() {
u.c[3] = 1; // no warning
const int const_subscript = 3;
- int array[1]; // expected-note {{declared here}}
- array[const_subscript] = 0; // expected-warning {{array index of '3' indexes past the end of an array (that contains 1 elements)}}
+ int array[2]; // expected-note {{declared here}}
+ array[const_subscript] = 0; // expected-warning {{array index of '3' indexes past the end of an array (that contains 2 elements)}}
int *ptr;
ptr[3] = 0; // no warning for pointer references
@@ -58,8 +58,8 @@ void test() {
const char str2[] = "foo"; // expected-note {{declared here}}
char c2 = str2[5]; // expected-warning {{array index of '5' indexes past the end of an array (that contains 4 elements)}}
- int (*array_ptr)[1];
- (*array_ptr)[3] = 1; // expected-warning {{array index of '3' indexes past the end of an array (that contains 1 elements)}}
+ int (*array_ptr)[2];
+ (*array_ptr)[3] = 1; // expected-warning {{array index of '3' indexes past the end of an array (that contains 2 elements)}}
}
template <int I> struct S {
@@ -173,3 +173,14 @@ void test_all_enums_covered(enum Values v) {
}
x[2] = 0; // no-warning
}
+
+namespace tailpad {
+ struct foo {
+ int x;
+ char c[1];
+ };
+
+ char bar(struct foo *F) {
+ return F->c[3]; // no warning, foo could have tail padding allocated.
+ }
+}
OpenPOWER on IntegriCloud