[clang] 5480be1 - [clang][NFC] Refactor Sema::DiagnoseSentinelCalls
Timm Bäder via cfe-commits
cfe-commits at lists.llvm.org
Tue Nov 14 23:59:15 PST 2023
Author: Timm Bäder
Date: 2023-11-15T08:37:01+01:00
New Revision: 5480be13d5bff9df8d306cd948ff975ed577c054
URL: https://github.com/llvm/llvm-project/commit/5480be13d5bff9df8d306cd948ff975ed577c054
DIFF: https://github.com/llvm/llvm-project/commit/5480be13d5bff9df8d306cd948ff975ed577c054.diff
LOG: [clang][NFC] Refactor Sema::DiagnoseSentinelCalls
Fix indentation, naming and capitalization to match current style
guides.
Added:
Modified:
clang/include/clang/Sema/Sema.h
clang/lib/Sema/SemaExpr.cpp
Removed:
################################################################################
diff --git a/clang/include/clang/Sema/Sema.h b/clang/include/clang/Sema/Sema.h
index 38377f01a10086f..a35a3c2c26c22ad 100644
--- a/clang/include/clang/Sema/Sema.h
+++ b/clang/include/clang/Sema/Sema.h
@@ -5452,7 +5452,7 @@ class Sema final {
bool DiagnosePropertyAccessorMismatch(ObjCPropertyDecl *PD,
ObjCMethodDecl *Getter,
SourceLocation Loc);
- void DiagnoseSentinelCalls(NamedDecl *D, SourceLocation Loc,
+ void DiagnoseSentinelCalls(const NamedDecl *D, SourceLocation Loc,
ArrayRef<Expr *> Args);
void PushExpressionEvaluationContext(
diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp
index 5b0c4439fd1710c..fc39d6149c1cc65 100644
--- a/clang/lib/Sema/SemaExpr.cpp
+++ b/clang/lib/Sema/SemaExpr.cpp
@@ -414,80 +414,83 @@ bool Sema::DiagnoseUseOfDecl(NamedDecl *D, ArrayRef<SourceLocation> Locs,
/// message-send is to a declaration with the sentinel attribute, and
/// if so, it checks that the requirements of the sentinel are
/// satisfied.
-void Sema::DiagnoseSentinelCalls(NamedDecl *D, SourceLocation Loc,
+void Sema::DiagnoseSentinelCalls(const NamedDecl *D, SourceLocation Loc,
ArrayRef<Expr *> Args) {
- const SentinelAttr *attr = D->getAttr<SentinelAttr>();
- if (!attr)
+ const SentinelAttr *Attr = D->getAttr<SentinelAttr>();
+ if (!Attr)
return;
// The number of formal parameters of the declaration.
- unsigned numFormalParams;
+ unsigned NumFormalParams;
// The kind of declaration. This is also an index into a %select in
// the diagnostic.
- enum CalleeType { CT_Function, CT_Method, CT_Block } calleeType;
-
- if (ObjCMethodDecl *MD = dyn_cast<ObjCMethodDecl>(D)) {
- numFormalParams = MD->param_size();
- calleeType = CT_Method;
- } else if (FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
- numFormalParams = FD->param_size();
- calleeType = CT_Function;
- } else if (isa<VarDecl>(D)) {
- QualType type = cast<ValueDecl>(D)->getType();
- const FunctionType *fn = nullptr;
- if (const PointerType *ptr = type->getAs<PointerType>()) {
- fn = ptr->getPointeeType()->getAs<FunctionType>();
- if (!fn) return;
- calleeType = CT_Function;
- } else if (const BlockPointerType *ptr = type->getAs<BlockPointerType>()) {
- fn = ptr->getPointeeType()->castAs<FunctionType>();
- calleeType = CT_Block;
+ enum { CK_Function, CK_Method, CK_Block } CalleeKind;
+
+ if (const auto *MD = dyn_cast<ObjCMethodDecl>(D)) {
+ NumFormalParams = MD->param_size();
+ CalleeKind = CK_Method;
+ } else if (const auto *FD = dyn_cast<FunctionDecl>(D)) {
+ NumFormalParams = FD->param_size();
+ CalleeKind = CK_Function;
+ } else if (const auto *VD = dyn_cast<VarDecl>(D)) {
+ QualType Ty = VD->getType();
+ const FunctionType *Fn = nullptr;
+ if (const auto *PtrTy = Ty->getAs<PointerType>()) {
+ Fn = PtrTy->getPointeeType()->getAs<FunctionType>();
+ if (!Fn)
+ return;
+ CalleeKind = CK_Function;
+ } else if (const auto *PtrTy = Ty->getAs<BlockPointerType>()) {
+ Fn = PtrTy->getPointeeType()->castAs<FunctionType>();
+ CalleeKind = CK_Block;
} else {
return;
}
- if (const FunctionProtoType *proto = dyn_cast<FunctionProtoType>(fn)) {
- numFormalParams = proto->getNumParams();
- } else {
- numFormalParams = 0;
- }
+ if (const auto *proto = dyn_cast<FunctionProtoType>(Fn))
+ NumFormalParams = proto->getNumParams();
+ else
+ NumFormalParams = 0;
} else {
return;
}
- // "nullPos" is the number of formal parameters at the end which
+ // "NullPos" is the number of formal parameters at the end which
// effectively count as part of the variadic arguments. This is
// useful if you would prefer to not have *any* formal parameters,
// but the language forces you to have at least one.
- unsigned nullPos = attr->getNullPos();
- assert((nullPos == 0 || nullPos == 1) && "invalid null position on sentinel");
- numFormalParams = (nullPos > numFormalParams ? 0 : numFormalParams - nullPos);
+ unsigned NullPos = Attr->getNullPos();
+ assert((NullPos == 0 || NullPos == 1) && "invalid null position on sentinel");
+ NumFormalParams = (NullPos > NumFormalParams ? 0 : NumFormalParams - NullPos);
// The number of arguments which should follow the sentinel.
- unsigned numArgsAfterSentinel = attr->getSentinel();
+ unsigned NumArgsAfterSentinel = Attr->getSentinel();
// If there aren't enough arguments for all the formal parameters,
// the sentinel, and the args after the sentinel, complain.
- if (Args.size() < numFormalParams + numArgsAfterSentinel + 1) {
+ if (Args.size() < NumFormalParams + NumArgsAfterSentinel + 1) {
Diag(Loc, diag::warn_not_enough_argument) << D->getDeclName();
- Diag(D->getLocation(), diag::note_sentinel_here) << int(calleeType);
+ Diag(D->getLocation(), diag::note_sentinel_here) << int(CalleeKind);
return;
}
// Otherwise, find the sentinel expression.
- Expr *sentinelExpr = Args[Args.size() - numArgsAfterSentinel - 1];
- if (!sentinelExpr) return;
- if (sentinelExpr->isValueDependent()) return;
- if (Context.isSentinelNullExpr(sentinelExpr)) return;
+ const Expr *SentinelExpr = Args[Args.size() - NumArgsAfterSentinel - 1];
+ if (!SentinelExpr)
+ return;
+ if (SentinelExpr->isValueDependent())
+ return;
+ if (Context.isSentinelNullExpr(SentinelExpr))
+ return;
// Pick a reasonable string to insert. Optimistically use 'nil', 'nullptr',
// or 'NULL' if those are actually defined in the context. Only use
// 'nil' for ObjC methods, where it's much more likely that the
// variadic arguments form a list of object pointers.
- SourceLocation MissingNilLoc = getLocForEndOfToken(sentinelExpr->getEndLoc());
+ SourceLocation MissingNilLoc = getLocForEndOfToken(SentinelExpr->getEndLoc());
std::string NullValue;
- if (calleeType == CT_Method && PP.isMacroDefined("nil"))
+ if (CalleeKind == CK_Method && PP.isMacroDefined("nil"))
NullValue = "nil";
else if (getLangOpts().CPlusPlus11)
NullValue = "nullptr";
@@ -497,12 +500,13 @@ void Sema::DiagnoseSentinelCalls(NamedDecl *D, SourceLocation Loc,
NullValue = "(void*) 0";
if (MissingNilLoc.isInvalid())
- Diag(Loc, diag::warn_missing_sentinel) << int(calleeType);
+ Diag(Loc, diag::warn_missing_sentinel) << int(CalleeKind);
else
Diag(MissingNilLoc, diag::warn_missing_sentinel)
- << int(calleeType)
- << FixItHint::CreateInsertion(MissingNilLoc, ", " + NullValue);
- Diag(D->getLocation(), diag::note_sentinel_here) << int(calleeType);
+ << int(CalleeKind)
+ << FixItHint::CreateInsertion(MissingNilLoc, ", " + NullValue);
+ Diag(D->getLocation(), diag::note_sentinel_here)
+ << int(CalleeKind) << Attr->getRange();
}
SourceRange Sema::getExprRange(Expr *E) const {
More information about the cfe-commits
mailing list