From: Ted Kremenek Date: Fri, 21 Jan 2011 22:49:49 +0000 (+0000) Subject: Provide -Wuninitialized-experimental fixits X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=dcfb360f6e1aaab0754a98e1e245c2607c46058a;p=clang Provide -Wuninitialized-experimental fixits for floats, and also check if 'nil' is declared when suggesting it for initializing ObjC pointers. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@124004 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/AnalysisBasedWarnings.cpp b/lib/Sema/AnalysisBasedWarnings.cpp index 91f95a762a..38284f6627 100644 --- a/lib/Sema/AnalysisBasedWarnings.cpp +++ b/lib/Sema/AnalysisBasedWarnings.cpp @@ -421,12 +421,19 @@ public: // Suggest possible initialization (if any). const char *initialization = 0; - QualType vdTy = vd->getType(); + QualType vdTy = vd->getType().getCanonicalType(); if (vdTy->getAs()) { - initialization = " = nil"; + // Check if 'nil' is defined. + if (S.PP.getMacroInfo(&S.getASTContext().Idents.get("nil"))) + initialization = " = nil"; + else + initialization = " = 0"; } - else if (vdTy->getAs()) { + else if (vdTy->isRealFloatingType()) { + initialization = " = 0.0"; + } + else if (vdTy->isScalarType()) { initialization = " = 0"; } diff --git a/test/Sema/uninit-variables.c b/test/Sema/uninit-variables.c index 76c3dc12c2..aed7a70966 100644 --- a/test/Sema/uninit-variables.c +++ b/test/Sema/uninit-variables.c @@ -1,7 +1,7 @@ // RUN: %clang_cc1 -fsyntax-only -Wuninitialized-experimental -fsyntax-only %s -verify int test1() { - int x; // expected-warning{{use of uninitialized variable 'x'}} + int x; // expected-warning{{use of uninitialized variable 'x'}} expected-note{{add initialization to silence this warning}} return x; // expected-note{{variable 'x' is possibly uninitialized when used here}} } @@ -17,25 +17,25 @@ int test3() { } int test4() { - int x; // expected-warning{{use of uninitialized variable 'x'}} + int x; // expected-warning{{use of uninitialized variable 'x'}} expected-note{{add initialization to silence this warning}} ++x; // expected-note{{variable 'x' is possibly uninitialized when used here}} return x; } int test5() { - int x, y; // expected-warning{{use of uninitialized variable 'y'}} + int x, y; // expected-warning{{use of uninitialized variable 'y'}} expected-note{{add initialization to silence this warning}} x = y; // expected-note{{variable 'y' is possibly uninitialized when used here}} return x; } int test6() { - int x; // expected-warning{{use of uninitialized variable 'x'}} + int x; // expected-warning{{use of uninitialized variable 'x'}} expected-note{{add initialization to silence this warning}} x += 2; // expected-note{{variable 'x' is possibly uninitialized when used here}} return x; } int test7(int y) { - int x; // expected-warning{{use of uninitialized variable 'x'}} + int x; // expected-warning{{use of uninitialized variable 'x'}} expected-note{{add initialization to silence this warning}} if (y) x = 1; return x; // expected-note{{variable 'x' is possibly uninitialized when used here}} @@ -51,7 +51,7 @@ int test8(int y) { } int test9(int n) { - int x; // expected-warning{{use of uninitialized variable 'x'}} + int x; // expected-warning{{use of uninitialized variable 'x'}} expected-note{{add initialization to silence this warning}} for (unsigned i = 0 ; i < n; ++i) { if (i == n - 1) break; @@ -61,7 +61,7 @@ int test9(int n) { } int test10(unsigned n) { - int x; // expected-warning{{use of uninitialized variable 'x'}} + int x; // expected-warning{{use of uninitialized variable 'x'}} expected-note{{add initialization to silence this warning}} for (unsigned i = 0 ; i < n; ++i) { x = 1; } @@ -69,7 +69,7 @@ int test10(unsigned n) { } int test11(unsigned n) { - int x; // expected-warning{{use of uninitialized variable 'x'}} + int x; // expected-warning{{use of uninitialized variable 'x'}} expected-note{{add initialization to silence this warning}} for (unsigned i = 0 ; i <= n; ++i) { x = 1; } @@ -77,7 +77,7 @@ int test11(unsigned n) { } void test12(unsigned n) { - for (unsigned i ; n ; ++i) ; // expected-warning{{use of uninitialized variable 'i'}} expected-note{{variable 'i' is possibly uninitialized when used here}}} + for (unsigned i ; n ; ++i) ; // expected-warning{{use of uninitialized variable 'i'}} expected-note{{variable 'i' is possibly uninitialized when used here}}} expected-note{{add initialization to silence this warning}} } int test13() { @@ -92,7 +92,7 @@ void test14() { } void test15() { - int x = x; // expected-warning{{use of uninitialized variable 'x'}} expected-note{{variable 'x' is possibly uninitialized when used here}} + int x = x; // expected-warning{{use of uninitialized variable 'x'}} expected-note{{variable 'x' is possibly uninitialized when used here}} expected-note{{add initialization to silence this warning}} } // Don't warn in the following example; shows dataflow confluence. @@ -130,14 +130,14 @@ int test19() { } int test20() { - int z; // expected-warning{{use of uninitialized variable 'z'}} + int z; // expected-warning{{use of uninitialized variable 'z'}} expected-note{{add initialization to silence this warning}} if ((test19_aux1() + test19_aux2() && test19_aux1()) || test19_aux3(&z)) return z; // expected-note{{variable 'z' is possibly uninitialized when used here}} return 0; } int test21(int x, int y) { - int z; // expected-warning{{use of uninitialized variable 'z'}} + int z; // expected-warning{{use of uninitialized variable 'z'}} expected-note{{add initialization to silence this warning}} if ((x && y) || test19_aux3(&z) || test19_aux2()) return z; // expected-note{{variable 'z' is possibly uninitialized when used here}} return 0; @@ -162,7 +162,7 @@ int test23() { // conditionals. This possibly can be handled by making the CFG itself // represent such control-dependencies, but it is a niche case. int test24(int flag) { - unsigned val; // expected-warning{{use of uninitialized variable 'val'}} + unsigned val; // expected-warning{{use of uninitialized variable 'val'}} expected-note{{add initialization to silence this warning}} if (flag) val = 1; if (!flag) @@ -170,3 +170,13 @@ int test24(int flag) { return val; // expected-note{{variable 'val' is possibly uninitialized when used here}} } +float test25() { + float x; // expected-warning{{use of uninitialized variable 'x'}} expected-note{{add initialization to silence this warning}} + return x; // expected-note{{variable 'x' is possibly uninitialized when used here}} +} + +typedef int MyInt; +MyInt test26() { + MyInt x; // expected-warning{{use of uninitialized variable 'x'}} expected-note{{add initialization to silence this warning}} + return x; // expected-note{{variable 'x' is possibly uninitialized when used here}} +} diff --git a/test/SemaCXX/uninit-variables.cpp b/test/SemaCXX/uninit-variables.cpp index 6d2956296a..49e6eb58c2 100644 --- a/test/SemaCXX/uninit-variables.cpp +++ b/test/SemaCXX/uninit-variables.cpp @@ -33,7 +33,7 @@ unsigned test3_b() { return x; // no-warning } unsigned test3_c() { - unsigned x ; // expected-warning{{use of uninitialized variable 'x'}} + unsigned x ; // expected-warning{{use of uninitialized variable 'x'}} expected-note{{add initialization to silence this warning}} const bool flag = false; if (flag && (x = test3_aux()) == 0) { x = 1;