зеркало из https://github.com/microsoft/clang-1.git
Small tweaks to the transfer function for DeclStmt: do not mark external global
variables as uninitialized, and only "initialize" static function variables. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@47683 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
de808ca855
Коммит
b0ab2120e5
|
@ -592,13 +592,25 @@ void GRExprEngine::VisitDeclStmt(DeclStmt* DS, GRExprEngine::NodeTy* Pred,
|
|||
if (VD->getType()->isArrayType())
|
||||
continue;
|
||||
|
||||
// FIXME: static variables have an initializer, but the second
|
||||
// time a function is called those values may not be current.
|
||||
const Expr* Ex = VD->getInit();
|
||||
|
||||
if (!VD->hasGlobalStorage() || VD->getStorageClass() == VarDecl::Static) {
|
||||
|
||||
// In this context, Static => Local variable.
|
||||
|
||||
assert (!VD->getStorageClass() == VarDecl::Static ||
|
||||
!isa<FileVarDecl>(VD));
|
||||
|
||||
// If there is no initializer, set the value of the
|
||||
// variable to "Uninitialized".
|
||||
//
|
||||
// FIXME: static variables may have an initializer, but the second
|
||||
// time a function is called those values may not be current.
|
||||
|
||||
St = SetRVal(St, lval::DeclVal(VD),
|
||||
Ex ? GetRVal(St, Ex) : UninitializedVal());
|
||||
}
|
||||
}
|
||||
|
||||
Nodify(Dst, DS, Pred, St);
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче