зеркало из https://github.com/microsoft/clang-1.git
Make warnings about uninitialized fields include the field name.
This makes the wording more informative, and consistent with the other warnings about uninitialized variables. Also, me and David who reviewed this couldn't figure out why we would need to do a lookup to get the name of the variable; so just print the name directly. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@164366 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
85cb7a5696
Коммит
7821e07567
|
@ -1210,10 +1210,10 @@ def err_init_reference_member_uninitialized : Error<
|
||||||
"reference member of type %0 uninitialized">;
|
"reference member of type %0 uninitialized">;
|
||||||
def note_uninit_reference_member : Note<
|
def note_uninit_reference_member : Note<
|
||||||
"uninitialized reference member is here">;
|
"uninitialized reference member is here">;
|
||||||
def warn_field_is_uninit : Warning<"field is uninitialized when used here">,
|
def warn_field_is_uninit : Warning<"field %0 is uninitialized when used here">,
|
||||||
InGroup<Uninitialized>;
|
InGroup<Uninitialized>;
|
||||||
def warn_reference_field_is_uninit : Warning<
|
def warn_reference_field_is_uninit : Warning<
|
||||||
"reference is not yet bound to a value when used here">,
|
"reference %0 is not yet bound to a value when used here">,
|
||||||
InGroup<Uninitialized>;
|
InGroup<Uninitialized>;
|
||||||
def warn_uninit_self_reference_in_init : Warning<
|
def warn_uninit_self_reference_in_init : Warning<
|
||||||
"variable %0 is uninitialized when used within its own initialization">,
|
"variable %0 is uninitialized when used within its own initialization">,
|
||||||
|
|
|
@ -6328,14 +6328,12 @@ namespace {
|
||||||
void HandleDeclRefExpr(DeclRefExpr *DRE) {
|
void HandleDeclRefExpr(DeclRefExpr *DRE) {
|
||||||
Decl* ReferenceDecl = DRE->getDecl();
|
Decl* ReferenceDecl = DRE->getDecl();
|
||||||
if (OrigDecl != ReferenceDecl) return;
|
if (OrigDecl != ReferenceDecl) return;
|
||||||
LookupResult Result(S, DRE->getNameInfo(), Sema::LookupOrdinaryName,
|
|
||||||
Sema::NotForRedeclaration);
|
|
||||||
unsigned diag = isReferenceType
|
unsigned diag = isReferenceType
|
||||||
? diag::warn_uninit_self_reference_in_reference_init
|
? diag::warn_uninit_self_reference_in_reference_init
|
||||||
: diag::warn_uninit_self_reference_in_init;
|
: diag::warn_uninit_self_reference_in_init;
|
||||||
S.DiagRuntimeBehavior(DRE->getLocStart(), DRE,
|
S.DiagRuntimeBehavior(DRE->getLocStart(), DRE,
|
||||||
S.PDiag(diag)
|
S.PDiag(diag)
|
||||||
<< Result.getLookupName()
|
<< DRE->getNameInfo().getName()
|
||||||
<< OrigDecl->getLocation()
|
<< OrigDecl->getLocation()
|
||||||
<< DRE->getSourceRange());
|
<< DRE->getSourceRange());
|
||||||
}
|
}
|
||||||
|
|
|
@ -1717,7 +1717,7 @@ namespace {
|
||||||
unsigned diag = VD->getType()->isReferenceType()
|
unsigned diag = VD->getType()->isReferenceType()
|
||||||
? diag::warn_reference_field_is_uninit
|
? diag::warn_reference_field_is_uninit
|
||||||
: diag::warn_field_is_uninit;
|
: diag::warn_field_is_uninit;
|
||||||
S.Diag(ME->getExprLoc(), diag);
|
S.Diag(ME->getExprLoc(), diag) << ME->getMemberNameInfo().getName();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -135,12 +135,12 @@ class InitializeUsingSelfTest {
|
||||||
TwoInOne D;
|
TwoInOne D;
|
||||||
int E;
|
int E;
|
||||||
InitializeUsingSelfTest(int F)
|
InitializeUsingSelfTest(int F)
|
||||||
: A(A), // expected-warning {{field is uninitialized when used here}}
|
: A(A), // expected-warning {{field 'A' is uninitialized when used here}}
|
||||||
B((((B)))), // expected-warning {{field is uninitialized when used here}}
|
B((((B)))), // expected-warning {{field 'B' is uninitialized when used here}}
|
||||||
C(A && InitializeUsingSelfTest::C), // expected-warning {{field is uninitialized when used here}}
|
C(A && InitializeUsingSelfTest::C), // expected-warning {{field 'C' is uninitialized when used here}}
|
||||||
D(D, // expected-warning {{field is uninitialized when used here}}
|
D(D, // expected-warning {{field 'D' is uninitialized when used here}}
|
||||||
D), // expected-warning {{field is uninitialized when used here}}
|
D), // expected-warning {{field 'D' is uninitialized when used here}}
|
||||||
E(IntParam(E)) {} // expected-warning {{field is uninitialized when used here}}
|
E(IntParam(E)) {} // expected-warning {{field 'E' is uninitialized when used here}}
|
||||||
};
|
};
|
||||||
|
|
||||||
int IntWrapper(int &i) { return 0; };
|
int IntWrapper(int &i) { return 0; };
|
||||||
|
@ -160,8 +160,8 @@ class CopyConstructorTest {
|
||||||
bool A, B, C;
|
bool A, B, C;
|
||||||
CopyConstructorTest(const CopyConstructorTest& rhs)
|
CopyConstructorTest(const CopyConstructorTest& rhs)
|
||||||
: A(rhs.A),
|
: A(rhs.A),
|
||||||
B(B), // expected-warning {{field is uninitialized when used here}}
|
B(B), // expected-warning {{field 'B' is uninitialized when used here}}
|
||||||
C(rhs.C || C) { } // expected-warning {{field is uninitialized when used here}}
|
C(rhs.C || C) { } // expected-warning {{field 'C' is uninitialized when used here}}
|
||||||
};
|
};
|
||||||
|
|
||||||
// Make sure we aren't marking default constructors when we shouldn't be.
|
// Make sure we aren't marking default constructors when we shouldn't be.
|
||||||
|
|
|
@ -9,6 +9,6 @@ struct bar {
|
||||||
struct foo {
|
struct foo {
|
||||||
bar b;
|
bar b;
|
||||||
foo()
|
foo()
|
||||||
: b(b) // expected-warning{{field is uninitialized}}
|
: b(b) // expected-warning{{field 'b' is uninitialized}}
|
||||||
{}
|
{}
|
||||||
};
|
};
|
||||||
|
|
|
@ -173,11 +173,11 @@ struct S {
|
||||||
int x;
|
int x;
|
||||||
void *ptr;
|
void *ptr;
|
||||||
|
|
||||||
S(bool (*)[1]) : x(x) {} // expected-warning {{field is uninitialized when used here}}
|
S(bool (*)[1]) : x(x) {} // expected-warning {{field 'x' is uninitialized when used here}}
|
||||||
S(bool (*)[2]) : x(x + 1) {} // expected-warning {{field is uninitialized when used here}}
|
S(bool (*)[2]) : x(x + 1) {} // expected-warning {{field 'x' is uninitialized when used here}}
|
||||||
S(bool (*)[3]) : x(x + x) {} // expected-warning 2{{field is uninitialized when used here}}
|
S(bool (*)[3]) : x(x + x) {} // expected-warning 2{{field 'x' is uninitialized when used here}}
|
||||||
S(bool (*)[4]) : x(static_cast<long>(x) + 1) {} // expected-warning {{field is uninitialized when used here}}
|
S(bool (*)[4]) : x(static_cast<long>(x) + 1) {} // expected-warning {{field 'x' is uninitialized when used here}}
|
||||||
S(bool (*)[5]) : x(foo(x)) {} // expected-warning {{field is uninitialized when used here}}
|
S(bool (*)[5]) : x(foo(x)) {} // expected-warning {{field 'x' is uninitialized when used here}}
|
||||||
|
|
||||||
// These don't actually require the value of x and so shouldn't warn.
|
// These don't actually require the value of x and so shouldn't warn.
|
||||||
S(char (*)[1]) : x(sizeof(x)) {} // rdar://8610363
|
S(char (*)[1]) : x(sizeof(x)) {} // rdar://8610363
|
||||||
|
@ -262,8 +262,8 @@ namespace {
|
||||||
C c;
|
C c;
|
||||||
D(char (*)[1]) : c(c.b.a.A1) {}
|
D(char (*)[1]) : c(c.b.a.A1) {}
|
||||||
D(char (*)[2]) : c(c.b.a.A2()) {}
|
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 (*)[3]) : c(c.b.a.A3) {} // expected-warning {{field 'c' is uninitialized when used here}}
|
||||||
D(char (*)[4]) : c(c.b.a.A4()) {} // expected-warning {{field is uninitialized when used here}}
|
D(char (*)[4]) : c(c.b.a.A4()) {} // expected-warning {{field 'c' is uninitialized when used here}}
|
||||||
|
|
||||||
// c::a is static, so it is already initialized
|
// c::a is static, so it is already initialized
|
||||||
D(char (*)[5]) : c(c.a.A1) {}
|
D(char (*)[5]) : c(c.a.A1) {}
|
||||||
|
@ -274,21 +274,21 @@ namespace {
|
||||||
|
|
||||||
struct E {
|
struct E {
|
||||||
int a, b, c;
|
int a, b, c;
|
||||||
E(char (*)[1]) : a(a ? b : c) {} // expected-warning {{field is uninitialized when used here}}
|
E(char (*)[1]) : a(a ? b : c) {} // expected-warning {{field 'a' is uninitialized when used here}}
|
||||||
E(char (*)[2]) : a(b ? a : a) {} // expected-warning 2{{field is uninitialized when used here}}
|
E(char (*)[2]) : a(b ? a : a) {} // expected-warning 2{{field 'a' is uninitialized when used here}}
|
||||||
E(char (*)[3]) : a(b ? (a) : c) {} // expected-warning {{field is uninitialized when used here}}
|
E(char (*)[3]) : a(b ? (a) : c) {} // expected-warning {{field 'a' is uninitialized when used here}}
|
||||||
E(char (*)[4]) : a(b ? c : (a+c)) {} // expected-warning {{field is uninitialized when used here}}
|
E(char (*)[4]) : a(b ? c : (a+c)) {} // expected-warning {{field 'a' is uninitialized when used here}}
|
||||||
E(char (*)[5]) : a(b ? c : b) {}
|
E(char (*)[5]) : a(b ? c : b) {}
|
||||||
|
|
||||||
E(char (*)[6]) : a(a ?: a) {} // expected-warning 2{{field is uninitialized when used here}}
|
E(char (*)[6]) : a(a ?: a) {} // expected-warning 2{{field 'a' is uninitialized when used here}}
|
||||||
E(char (*)[7]) : a(b ?: a) {} // expected-warning {{field is uninitialized when used here}}
|
E(char (*)[7]) : a(b ?: a) {} // expected-warning {{field 'a' is uninitialized when used here}}
|
||||||
E(char (*)[8]) : a(a ?: c) {} // expected-warning {{field is uninitialized when used here}}
|
E(char (*)[8]) : a(a ?: c) {} // expected-warning {{field 'a' is uninitialized when used here}}
|
||||||
E(char (*)[9]) : a(b ?: c) {}
|
E(char (*)[9]) : a(b ?: c) {}
|
||||||
|
|
||||||
E(char (*)[10]) : a((a, a, b)) {}
|
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 (*)[11]) : a((c + a, a + 1, b)) {} // expected-warning 2{{field 'a' is uninitialized when used here}}
|
||||||
E(char (*)[12]) : a((b + c, c, a)) {} // expected-warning {{field is uninitialized when used here}}
|
E(char (*)[12]) : a((b + c, c, a)) {} // expected-warning {{field 'a' is uninitialized when used here}}
|
||||||
E(char (*)[13]) : a((a, a, a, a)) {} // expected-warning {{field is uninitialized when used here}}
|
E(char (*)[13]) : a((a, a, a, a)) {} // expected-warning {{field 'a' is uninitialized when used here}}
|
||||||
E(char (*)[14]) : a((b, c, c)) {}
|
E(char (*)[14]) : a((b, c, c)) {}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -304,16 +304,16 @@ namespace {
|
||||||
struct G {
|
struct G {
|
||||||
F f1, f2;
|
F f1, f2;
|
||||||
F *f3, *f4;
|
F *f3, *f4;
|
||||||
G(char (*)[1]) : f1(f1) {} // expected-warning {{field is uninitialized when used here}}
|
G(char (*)[1]) : f1(f1) {} // expected-warning {{field 'f1' is uninitialized when used here}}
|
||||||
G(char (*)[2]) : f2(f1) {}
|
G(char (*)[2]) : f2(f1) {}
|
||||||
G(char (*)[3]) : f2(F()) {}
|
G(char (*)[3]) : f2(F()) {}
|
||||||
|
|
||||||
G(char (*)[4]) : f1(f1.*ptr) {} // expected-warning {{field is uninitialized when used here}}
|
G(char (*)[4]) : f1(f1.*ptr) {} // expected-warning {{field 'f1' is uninitialized when used here}}
|
||||||
G(char (*)[5]) : f2(f1.*ptr) {}
|
G(char (*)[5]) : f2(f1.*ptr) {}
|
||||||
|
|
||||||
G(char (*)[6]) : f3(f3) {} // expected-warning {{field is uninitialized when used here}}
|
G(char (*)[6]) : f3(f3) {} // expected-warning {{field 'f3' is uninitialized when used here}}
|
||||||
G(char (*)[7]) : f3(f3->*f_ptr) {} // expected-warning {{field is uninitialized when used here}}
|
G(char (*)[7]) : f3(f3->*f_ptr) {} // expected-warning {{field 'f3' is uninitialized when used here}}
|
||||||
G(char (*)[8]) : f3(new F(f3->*ptr)) {} // expected-warning {{field is uninitialized when used here}}
|
G(char (*)[8]) : f3(new F(f3->*ptr)) {} // expected-warning {{field 'f3' is uninitialized when used here}}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -381,7 +381,7 @@ namespace statics {
|
||||||
|
|
||||||
namespace in_class_initializers {
|
namespace in_class_initializers {
|
||||||
struct S {
|
struct S {
|
||||||
S() : a(a + 1) {} // expected-warning{{field is uninitialized when used here}}
|
S() : a(a + 1) {} // expected-warning{{field 'a' is uninitialized when used here}}
|
||||||
int a = 42; // Note: because a is in a member initializer list, this initialization is ignored.
|
int a = 42; // Note: because a is in a member initializer list, this initialization is ignored.
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -402,7 +402,7 @@ namespace references {
|
||||||
int &a = a; // expected-warning{{reference 'a' is not yet bound to a value when used within its own initialization}}
|
int &a = a; // expected-warning{{reference 'a' is not yet bound to a value when used within its own initialization}}
|
||||||
|
|
||||||
struct S {
|
struct S {
|
||||||
S() : a(a) {} // expected-warning{{reference is not yet bound to a value when used here}}
|
S() : a(a) {} // expected-warning{{reference 'a' is not yet bound to a value when used here}}
|
||||||
int &a;
|
int &a;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -413,7 +413,7 @@ namespace references {
|
||||||
struct T {
|
struct T {
|
||||||
T() : a(b), b(a) {} // FIXME: Warn here.
|
T() : a(b), b(a) {} // FIXME: Warn here.
|
||||||
int &a, &b;
|
int &a, &b;
|
||||||
int &c = c; // expected-warning{{reference is not yet bound to a value when used here}}
|
int &c = c; // expected-warning{{reference 'c' is not yet bound to a value when used here}}
|
||||||
};
|
};
|
||||||
|
|
||||||
int x;
|
int x;
|
||||||
|
|
Загрузка…
Ссылка в новой задаче