forked from OSchip/llvm-project
Reword warning about using a *static* variable within its own initialization.
The warning is still under -Wuninitialized (although technically this is defined behavior), but under a subgroup -Wstatic-self-init. This addresses PR 10265. llvm-svn: 172878
This commit is contained in:
parent
cc99c42130
commit
e07d167a50
|
@ -259,7 +259,9 @@ def UndefinedReinterpretCast : DiagGroup<"undefined-reinterpret-cast">;
|
|||
def Unicode : DiagGroup<"unicode">;
|
||||
def UninitializedMaybe : DiagGroup<"conditional-uninitialized">;
|
||||
def UninitializedSometimes : DiagGroup<"sometimes-uninitialized">;
|
||||
def Uninitialized : DiagGroup<"uninitialized", [UninitializedSometimes]>;
|
||||
def UninitializedStaticSelfInit : DiagGroup<"static-self-init">;
|
||||
def Uninitialized : DiagGroup<"uninitialized", [UninitializedSometimes,
|
||||
UninitializedStaticSelfInit]>;
|
||||
def UnknownPragmas : DiagGroup<"unknown-pragmas">;
|
||||
def UnknownWarningOption : DiagGroup<"unknown-warning-option">;
|
||||
def NSobjectAttribute : DiagGroup<"NSObject-attribute">;
|
||||
|
|
|
@ -1292,6 +1292,9 @@ def warn_field_is_uninit : Warning<"field %0 is uninitialized when used here">,
|
|||
def warn_reference_field_is_uninit : Warning<
|
||||
"reference %0 is not yet bound to a value when used here">,
|
||||
InGroup<Uninitialized>;
|
||||
def warn_static_self_reference_in_init : Warning<
|
||||
"static variable %0 is suspiciously used within its own initialization">,
|
||||
InGroup<UninitializedStaticSelfInit>;
|
||||
def warn_uninit_self_reference_in_init : Warning<
|
||||
"variable %0 is uninitialized when used within its own initialization">,
|
||||
InGroup<Uninitialized>;
|
||||
|
|
|
@ -6683,11 +6683,17 @@ namespace {
|
|||
void VisitObjCMessageExpr(ObjCMessageExpr *E) { return; }
|
||||
|
||||
void HandleDeclRefExpr(DeclRefExpr *DRE) {
|
||||
Decl* ReferenceDecl = DRE->getDecl();
|
||||
Decl* ReferenceDecl = DRE->getDecl();
|
||||
if (OrigDecl != ReferenceDecl) return;
|
||||
unsigned diag = isReferenceType
|
||||
? diag::warn_uninit_self_reference_in_reference_init
|
||||
: diag::warn_uninit_self_reference_in_init;
|
||||
unsigned diag;
|
||||
if (isReferenceType) {
|
||||
diag = diag::warn_uninit_self_reference_in_reference_init;
|
||||
} else if (cast<VarDecl>(OrigDecl)->isStaticLocal()) {
|
||||
diag = diag::warn_static_self_reference_in_init;
|
||||
} else {
|
||||
diag = diag::warn_uninit_self_reference_in_init;
|
||||
}
|
||||
|
||||
S.DiagRuntimeBehavior(DRE->getLocStart(), DRE,
|
||||
S.PDiag(diag)
|
||||
<< DRE->getNameInfo().getName()
|
||||
|
|
Loading…
Reference in New Issue