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 { _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits