зеркало из https://github.com/microsoft/clang-1.git
Move isSentinelNullExpr() from Sema to ASTContext to make it more widely
available. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@149675 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
d603bd1268
Коммит
8deabc133c
|
@ -1664,6 +1664,8 @@ public:
|
|||
return Res;
|
||||
}
|
||||
|
||||
bool isSentinelNullExpr(const Expr *E);
|
||||
|
||||
/// \brief Get the implementation of ObjCInterfaceDecl,or NULL if none exists.
|
||||
ObjCImplementationDecl *getObjCImplementation(ObjCInterfaceDecl *D);
|
||||
/// \brief Get the implementation of ObjCCategoryDecl, or NULL if none exists.
|
||||
|
|
|
@ -1381,7 +1381,6 @@ public:
|
|||
QualType &ConvertedType);
|
||||
bool IsBlockPointerConversion(QualType FromType, QualType ToType,
|
||||
QualType& ConvertedType);
|
||||
bool isSentinelNullExpr(const Expr *E) const;
|
||||
bool FunctionArgTypesAreEqual(const FunctionProtoType *OldType,
|
||||
const FunctionProtoType *NewType,
|
||||
unsigned *ArgPos = 0);
|
||||
|
|
|
@ -1247,6 +1247,24 @@ unsigned ASTContext::CountNonClassIvars(const ObjCInterfaceDecl *OI) const {
|
|||
return count;
|
||||
}
|
||||
|
||||
bool ASTContext::isSentinelNullExpr(const Expr *E) {
|
||||
if (!E)
|
||||
return false;
|
||||
|
||||
// nullptr_t is always treated as null.
|
||||
if (E->getType()->isNullPtrType()) return true;
|
||||
|
||||
if (E->getType()->isAnyPointerType() &&
|
||||
E->IgnoreParenCasts()->isNullPointerConstant(*this,
|
||||
Expr::NPC_ValueDependentIsNull))
|
||||
return true;
|
||||
|
||||
// Unfortunately, __null has type 'int'.
|
||||
if (isa<GNUNullExpr>(E)) return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/// \brief Get the implementation of ObjCInterfaceDecl,or NULL if none exists.
|
||||
ObjCImplementationDecl *ASTContext::getObjCImplementation(ObjCInterfaceDecl *D) {
|
||||
llvm::DenseMap<ObjCContainerDecl*, ObjCImplDecl*>::iterator
|
||||
|
|
|
@ -249,7 +249,7 @@ void Sema::DiagnoseSentinelCalls(NamedDecl *D, SourceLocation Loc,
|
|||
Expr *sentinelExpr = args[numArgs - numArgsAfterSentinel - 1];
|
||||
if (!sentinelExpr) return;
|
||||
if (sentinelExpr->isValueDependent()) return;
|
||||
if (isSentinelNullExpr(sentinelExpr)) return;
|
||||
if (Context.isSentinelNullExpr(sentinelExpr)) return;
|
||||
|
||||
// Pick a reasonable string to insert. Optimistically use 'nil' or
|
||||
// 'NULL' if those are actually defined in the context. Only use
|
||||
|
@ -279,24 +279,6 @@ SourceRange Sema::getExprRange(Expr *E) const {
|
|||
return E ? E->getSourceRange() : SourceRange();
|
||||
}
|
||||
|
||||
bool Sema::isSentinelNullExpr(const Expr *E) const {
|
||||
if (!E)
|
||||
return false;
|
||||
|
||||
// nullptr_t is always treated as null.
|
||||
if (E->getType()->isNullPtrType()) return true;
|
||||
|
||||
if (E->getType()->isAnyPointerType() &&
|
||||
E->IgnoreParenCasts()->isNullPointerConstant(Context,
|
||||
Expr::NPC_ValueDependentIsNull))
|
||||
return true;
|
||||
|
||||
// Unfortunately, __null has type 'int'.
|
||||
if (isa<GNUNullExpr>(E)) return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Standard Promotions and Conversions
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
|
Загрузка…
Ссылка в новой задаче