diff options
author | dim <dim@FreeBSD.org> | 2012-08-15 20:02:54 +0000 |
---|---|---|
committer | dim <dim@FreeBSD.org> | 2012-08-15 20:02:54 +0000 |
commit | 554bcb69c2d785a011a30e7db87a36a87fe7db10 (patch) | |
tree | 9abb1a658a297776086f4e0dfa6ca533de02104e /test/SemaCXX/uninitialized.cpp | |
parent | bb67ca86b31f67faee50bd10c3b036d65751745a (diff) | |
download | FreeBSD-src-554bcb69c2d785a011a30e7db87a36a87fe7db10.zip FreeBSD-src-554bcb69c2d785a011a30e7db87a36a87fe7db10.tar.gz |
Vendor import of clang trunk r161861:
http://llvm.org/svn/llvm-project/cfe/trunk@161861
Diffstat (limited to 'test/SemaCXX/uninitialized.cpp')
-rw-r--r-- | test/SemaCXX/uninitialized.cpp | 165 |
1 files changed, 157 insertions, 8 deletions
diff --git a/test/SemaCXX/uninitialized.cpp b/test/SemaCXX/uninitialized.cpp index 7879e7c..13d287bf 100644 --- a/test/SemaCXX/uninitialized.cpp +++ b/test/SemaCXX/uninitialized.cpp @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -fsyntax-only -Wall -Wuninitialized -std=c++11 -verify %s +// RUN: %clang_cc1 -fsyntax-only -Wall -Wuninitialized -Wno-unused-value -std=c++11 -verify %s int foo(int x); int bar(int* x); @@ -10,9 +10,6 @@ int far(const int& x); int a = a; // no-warning: used to signal intended lack of initialization. int b = b + 1; // expected-warning {{variable 'b' is uninitialized when used within its own initialization}} int c = (c + c); // expected-warning 2 {{variable 'c' is uninitialized when used within its own initialization}} -void test() { - int d = ({ d + d ;}); // expected-warning {{variable 'd' is uninitialized when used within its own initialization}} -} int e = static_cast<long>(e) + 1; // expected-warning {{variable 'e' is uninitialized when used within its own initialization}} int f = foo(f); // expected-warning {{variable 'f' is uninitialized when used within its own initialization}} @@ -24,6 +21,51 @@ int i = boo(i); int j = far(j); int k = __alignof__(k); +int l = k ? l : l; // expected-warning 2{{variable 'l' is uninitialized when used within its own initialization}} +int m = 1 + (k ? m : m); // expected-warning 2{{variable 'm' is uninitialized when used within its own initialization}} +int n = -n; // expected-warning {{variable 'n' is uninitialized when used within its own initialization}} + +void test_stuff () { + int a = a; // no-warning: used to signal intended lack of initialization. + int b = b + 1; // expected-warning {{variable 'b' is uninitialized when used within its own initialization}} + int c = (c + c); // expected-warning {{variable 'c' is uninitialized when used within its own initialization}} + int d = ({ d + d ;}); // expected-warning {{variable 'd' is uninitialized when used within its own initialization}} + int e = static_cast<long>(e) + 1; // expected-warning {{variable 'e' is uninitialized when used within its own initialization}} + int f = foo(f); // expected-warning {{variable 'f' is uninitialized when used within its own initialization}} + + // Thes don't warn as they don't require the value. + int g = sizeof(g); + void* ptr = &ptr; + int h = bar(&h); + int i = boo(i); + int j = far(j); + int k = __alignof__(k); + + int l = k ? l : l; // FIXME: warn here + int m = 1 + (k ? m : m); // FIXME: warn here + int n = -n; // expected-warning {{variable 'n' is uninitialized when used within its own initialization}} + + for (;;) { + int a = a; // no-warning: used to signal intended lack of initialization. + int b = b + 1; // expected-warning {{variable 'b' is uninitialized when used within its own initialization}} + int c = (c + c); // expected-warning {{variable 'c' is uninitialized when used within its own initialization}} + int d = ({ d + d ;}); // expected-warning {{variable 'd' is uninitialized when used within its own initialization}} + int e = static_cast<long>(e) + 1; // expected-warning {{variable 'e' is uninitialized when used within its own initialization}} + int f = foo(f); // expected-warning {{variable 'f' is uninitialized when used within its own initialization}} + + // Thes don't warn as they don't require the value. + int g = sizeof(g); + void* ptr = &ptr; + int h = bar(&h); + int i = boo(i); + int j = far(j); + int k = __alignof__(k); + + int l = k ? l : l; // FIXME: warn here + int m = 1 + (k ? m : m); // FIXME: warn here + int n = -n; // expected-warning {{variable 'n' is uninitialized when used within its own initialization}} + } +} // Test self-references with record types. class A { @@ -48,8 +90,9 @@ class A { A getA() { return A(); } A getA(int x) { return A(); } A getA(A* a) { return A(); } +A getA(A a) { return A(); } -void setupA() { +void setupA(bool x) { A a1; a1.set(a1.get()); A a2(a1.get()); @@ -69,8 +112,33 @@ void setupA() { A a15 = getA(a15.num); // expected-warning {{variable 'a15' is uninitialized when used within its own initialization}} A a16(&a16.num); // expected-warning {{variable 'a16' is uninitialized when used within its own initialization}} A a17(a17.get2()); // expected-warning {{variable 'a17' is uninitialized when used within its own initialization}} + A a18 = x ? a18 : a17; // expected-warning {{variable 'a18' is uninitialized when used within its own initialization}} + A a19 = getA(x ? a19 : a17); // expected-warning {{variable 'a19' is uninitialized when used within its own initialization}} } +bool x; + +A a1; +A a2(a1.get()); +A a3(a1); +A a4(&a4); +A a5(a5.zero()); +A a6(a6.ONE); +A a7 = getA(); +A a8 = getA(a8.TWO); +A a9 = getA(&a9); +A a10(a10.count); + +A a11(a11); // expected-warning {{variable 'a11' is uninitialized when used within its own initialization}} +A a12(a12.get()); // expected-warning {{variable 'a12' is uninitialized when used within its own initialization}} +A a13(a13.num); // expected-warning {{variable 'a13' is uninitialized when used within its own initialization}} +A a14 = A(a14); // expected-warning {{variable 'a14' is uninitialized when used within its own initialization}} +A a15 = getA(a15.num); // expected-warning {{variable 'a15' is uninitialized when used within its own initialization}} +A a16(&a16.num); // expected-warning {{variable 'a16' is uninitialized when used within its own initialization}} +A a17(a17.get2()); // expected-warning {{variable 'a17' is uninitialized when used within its own initialization}} +A a18 = x ? a18 : a17; // expected-warning {{variable 'a18' is uninitialized when used within its own initialization}} +A a19 = getA(x ? a19 : a17); // expected-warning {{variable 'a19' is uninitialized when used within its own initialization}} + struct B { // POD struct. int x; @@ -97,6 +165,7 @@ void setupB() { B b7(b7); // expected-warning {{variable 'b7' is uninitialized when used within its own initialization}} B b8 = getB(b8.x); // expected-warning {{variable 'b8' is uninitialized when used within its own initialization}} B b9 = getB(b9.y); // expected-warning {{variable 'b9' is uninitialized when used within its own initialization}} + B b10 = getB(-b10.x); // expected-warning {{variable 'b10' is uninitialized when used within its own initialization}} } // Also test similar constructs in a field's initializer. @@ -106,9 +175,9 @@ struct S { S(bool (*)[1]) : x(x) {} // expected-warning {{field is uninitialized when used here}} S(bool (*)[2]) : x(x + 1) {} // expected-warning {{field is uninitialized when used here}} - S(bool (*)[3]) : x(x + x) {} // expected-warning {{field is uninitialized when used here}} + S(bool (*)[3]) : x(x + x) {} // expected-warning 2{{field is uninitialized when used here}} S(bool (*)[4]) : x(static_cast<long>(x) + 1) {} // expected-warning {{field is uninitialized when used here}} - S(bool (*)[5]) : x(foo(x)) {} // FIXME: This should warn! + S(bool (*)[5]) : x(foo(x)) {} // expected-warning {{field is uninitialized when used here}} // These don't actually require the value of x and so shouldn't warn. S(char (*)[1]) : x(sizeof(x)) {} // rdar://8610363 @@ -164,6 +233,86 @@ int pr12325(int params) { // Test lambda expressions with -Wuninitialized int test_lambda() { - auto f1 = [] (int x, int y) { int z; return x + y + z; }; // expected-warning {{C++11 requires lambda with omitted result type to consist of a single return statement}} expected-warning{{variable 'z' is uninitialized when used here}} expected-note {{initialize the variable 'z' to silence this warning}} + auto f1 = [] (int x, int y) { int z; return x + y + z; }; // expected-warning{{variable 'z' is uninitialized when used here}} expected-note {{initialize the variable 'z' to silence this warning}} return f1(1, 2); } + +namespace { + struct A { + enum { A1 }; + static int A2() {return 5;} + int A3; + int A4() { return 5;} + }; + + struct B { + A a; + }; + + struct C { + C() {} + C(int x) {} + static A a; + B b; + }; + A C::a = A(); + + // Accessing non-static members will give a warning. + struct D { + C c; + D(char (*)[1]) : c(c.b.a.A1) {} + D(char (*)[2]) : c(c.b.a.A2()) {} + D(char (*)[3]) : c(c.b.a.A3) {} // expected-warning {{field is uninitialized when used here}} + D(char (*)[4]) : c(c.b.a.A4()) {} // expected-warning {{field is uninitialized when used here}} + + // c::a is static, so it is already initialized + D(char (*)[5]) : c(c.a.A1) {} + D(char (*)[6]) : c(c.a.A2()) {} + D(char (*)[7]) : c(c.a.A3) {} + D(char (*)[8]) : c(c.a.A4()) {} + }; + + struct E { + int a, b, c; + E(char (*)[1]) : a(a ? b : c) {} // expected-warning {{field is uninitialized when used here}} + E(char (*)[2]) : a(b ? a : a) {} // expected-warning 2{{field is uninitialized when used here}} + E(char (*)[3]) : a(b ? (a) : c) {} // expected-warning {{field is uninitialized when used here}} + E(char (*)[4]) : a(b ? c : (a+c)) {} // expected-warning {{field is uninitialized when used here}} + E(char (*)[5]) : a(b ? c : b) {} + + E(char (*)[6]) : a(a ?: a) {} // expected-warning 2{{field is uninitialized when used here}} + E(char (*)[7]) : a(b ?: a) {} // expected-warning {{field is uninitialized when used here}} + E(char (*)[8]) : a(a ?: c) {} // expected-warning {{field is uninitialized when used here}} + E(char (*)[9]) : a(b ?: c) {} + + E(char (*)[10]) : a((a, a, b)) {} + E(char (*)[11]) : a((c + a, a + 1, b)) {} // expected-warning 2{{field is uninitialized when used here}} + E(char (*)[12]) : a((b + c, c, a)) {} // expected-warning {{field is uninitialized when used here}} + E(char (*)[13]) : a((a, a, a, a)) {} // expected-warning {{field is uninitialized when used here}} + E(char (*)[14]) : a((b, c, c)) {} + }; + + struct F { + int a; + F* f; + F(int) {} + F() {} + }; + + int F::*ptr = &F::a; + F* F::*f_ptr = &F::f; + struct G { + F f1, f2; + F *f3, *f4; + G(char (*)[1]) : f1(f1) {} // expected-warning {{field is uninitialized when used here}} + G(char (*)[2]) : f2(f1) {} + G(char (*)[3]) : f2(F()) {} + + G(char (*)[4]) : f1(f1.*ptr) {} // expected-warning {{field is uninitialized when used here}} + G(char (*)[5]) : f2(f1.*ptr) {} + + G(char (*)[6]) : f3(f3) {} // expected-warning {{field is uninitialized when used here}} + G(char (*)[7]) : f3(f3->*f_ptr) {} // expected-warning {{field is uninitialized when used here}} + G(char (*)[8]) : f3(new F(f3->*ptr)) {} // expected-warning {{field is uninitialized when used here}} + }; +} |