I'll update with comments. The Stmt* is optional because we don't want to always result to using the reachability analysis to prune warnings (e.g., "unused value" warnings).
On Feb 22, 2011, at 6:25 PM, Chris Lattner wrote: > > On Feb 22, 2011, at 5:51 PM, Ted Kremenek wrote: > >> Author: kremenek >> Date: Tue Feb 22 19:51:43 2011 >> New Revision: 126286 >> >> URL: http://llvm.org/viewvc/llvm-project?rev=126286&view=rev >> Log: >> Update Sema::DiagRuntimeBehavior() to take an optional Stmt* to indicate the >> code the diagnostic is associated with. >> >> This Stmt* is unused, but we will use it shortly for pruning diagnostics >> associated >> with unreachable code. > > Cool, please add a doxygen comment on the method in Sema.h and update the one > in the .cpp file. Is there a reason for the Stmt to be optional? It seems > reasonable to make it required. > > -Chris > > >> >> Modified: >> cfe/trunk/include/clang/Sema/Sema.h >> cfe/trunk/lib/Sema/SemaChecking.cpp >> cfe/trunk/lib/Sema/SemaExpr.cpp >> cfe/trunk/lib/Sema/SemaStmt.cpp >> >> Modified: cfe/trunk/include/clang/Sema/Sema.h >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Sema/Sema.h?rev=126286&r1=126285&r2=126286&view=diff >> ============================================================================== >> --- cfe/trunk/include/clang/Sema/Sema.h (original) >> +++ cfe/trunk/include/clang/Sema/Sema.h Tue Feb 22 19:51:43 2011 >> @@ -1891,7 +1891,8 @@ >> void MarkDeclarationReferenced(SourceLocation Loc, Decl *D); >> void MarkDeclarationsReferencedInType(SourceLocation Loc, QualType T); >> void MarkDeclarationsReferencedInExpr(Expr *E); >> - bool DiagRuntimeBehavior(SourceLocation Loc, const PartialDiagnostic &PD); >> + bool DiagRuntimeBehavior(SourceLocation Loc, const Stmt *stmt, >> + const PartialDiagnostic &PD); >> >> // Primary Expressions. >> SourceRange getExprRange(Expr *E) const; >> >> Modified: cfe/trunk/lib/Sema/SemaChecking.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaChecking.cpp?rev=126286&r1=126285&r2=126286&view=diff >> ============================================================================== >> --- cfe/trunk/lib/Sema/SemaChecking.cpp (original) >> +++ cfe/trunk/lib/Sema/SemaChecking.cpp Tue Feb 22 19:51:43 2011 >> @@ -3135,12 +3135,12 @@ >> if (index.slt(size)) >> return; >> >> - DiagRuntimeBehavior(E->getBase()->getLocStart(), >> + DiagRuntimeBehavior(E->getBase()->getLocStart(), BaseExpr, >> PDiag(diag::warn_array_index_exceeds_bounds) >> << index.toString(10, true) << size.toString(10, true) >> << IndexExpr->getSourceRange()); >> } else { >> - DiagRuntimeBehavior(E->getBase()->getLocStart(), >> + DiagRuntimeBehavior(E->getBase()->getLocStart(), BaseExpr, >> PDiag(diag::warn_array_index_precedes_bounds) >> << index.toString(10, true) >> << IndexExpr->getSourceRange()); >> @@ -3152,7 +3152,7 @@ >> if (const MemberExpr *ME = dyn_cast<MemberExpr>(BaseExpr)) >> ND = dyn_cast<NamedDecl>(ME->getMemberDecl()); >> if (ND) >> - DiagRuntimeBehavior(ND->getLocStart(), >> + DiagRuntimeBehavior(ND->getLocStart(), BaseExpr, >> PDiag(diag::note_array_index_out_of_bounds) >> << ND->getDeclName()); >> } >> >> Modified: cfe/trunk/lib/Sema/SemaExpr.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExpr.cpp?rev=126286&r1=126285&r2=126286&view=diff >> ============================================================================== >> --- cfe/trunk/lib/Sema/SemaExpr.cpp (original) >> +++ cfe/trunk/lib/Sema/SemaExpr.cpp Tue Feb 22 19:51:43 2011 >> @@ -387,13 +387,13 @@ >> return false; >> >> if (Expr->getType()->isObjCObjectType() && >> - DiagRuntimeBehavior(Expr->getLocStart(), >> + DiagRuntimeBehavior(Expr->getLocStart(), Expr, >> PDiag(diag::err_cannot_pass_objc_interface_to_vararg) >> << Expr->getType() << CT)) >> return true; >> >> if (!Expr->getType()->isPODType() && >> - DiagRuntimeBehavior(Expr->getLocStart(), >> + DiagRuntimeBehavior(Expr->getLocStart(), Expr, >> PDiag(diag::warn_cannot_pass_non_pod_arg_to_vararg) >> << Expr->getType() << CT)) >> return true; >> @@ -6355,8 +6355,8 @@ >> // Check for division by zero. >> if (isDiv && >> rex->isNullPointerConstant(Context, Expr::NPC_ValueDependentIsNotNull)) >> - DiagRuntimeBehavior(Loc, PDiag(diag::warn_division_by_zero) >> - << rex->getSourceRange()); >> + DiagRuntimeBehavior(Loc, rex, PDiag(diag::warn_division_by_zero) >> + << rex->getSourceRange()); >> >> return compType; >> } >> @@ -6377,8 +6377,8 @@ >> >> // Check for remainder by zero. >> if (rex->isNullPointerConstant(Context, Expr::NPC_ValueDependentIsNotNull)) >> - DiagRuntimeBehavior(Loc, PDiag(diag::warn_remainder_by_zero) >> - << rex->getSourceRange()); >> + DiagRuntimeBehavior(Loc, rex, PDiag(diag::warn_remainder_by_zero) >> + << rex->getSourceRange()); >> >> return compType; >> } >> @@ -6721,7 +6721,7 @@ >> if (DeclRefExpr* DRR = dyn_cast<DeclRefExpr>(RHSStripped)) { >> if (DRL->getDecl() == DRR->getDecl() && >> !IsWithinTemplateSpecialization(DRL->getDecl())) { >> - DiagRuntimeBehavior(Loc, PDiag(diag::warn_comparison_always) >> + DiagRuntimeBehavior(Loc, lex, PDiag(diag::warn_comparison_always) >> << 0 // self- >> << (Opc == BO_EQ >> || Opc == BO_LE >> @@ -6743,7 +6743,7 @@ >> always_evals_to = 2; // e.g. array1 <= array2 >> break; >> } >> - DiagRuntimeBehavior(Loc, PDiag(diag::warn_comparison_always) >> + DiagRuntimeBehavior(Loc, lex, >> PDiag(diag::warn_comparison_always) >> << 1 // array >> << always_evals_to); >> } >> @@ -6784,7 +6784,7 @@ >> default: assert(false && "Invalid comparison operator"); >> } >> >> - DiagRuntimeBehavior(Loc, >> + DiagRuntimeBehavior(Loc, literalString, >> PDiag(diag::warn_stringcompare) >> << isa<ObjCEncodeExpr>(literalStringStripped) >> << literalString->getSourceRange()); >> @@ -7094,7 +7094,7 @@ >> if (DeclRefExpr* DRL = dyn_cast<DeclRefExpr>(lex->IgnoreParens())) >> if (DeclRefExpr* DRR = dyn_cast<DeclRefExpr>(rex->IgnoreParens())) >> if (DRL->getDecl() == DRR->getDecl()) >> - DiagRuntimeBehavior(Loc, >> + DiagRuntimeBehavior(Loc, rex, >> PDiag(diag::warn_comparison_always) >> << 0 // self- >> << 2 // "a constant" >> @@ -8546,7 +8546,7 @@ >> // (clause 9). >> if (CXXRecordDecl *CRD = dyn_cast<CXXRecordDecl>(RD)) { >> if (!CRD->isPOD() && !DidWarnAboutNonPOD && >> - DiagRuntimeBehavior(BuiltinLoc, >> + DiagRuntimeBehavior(BuiltinLoc, 0, >> PDiag(diag::warn_offsetof_non_pod_type) >> << SourceRange(CompPtr[0].LocStart, OC.LocEnd) >> << CurrentType)) >> @@ -9470,7 +9470,7 @@ >> /// behavior of a program, such as passing a non-POD value through an >> ellipsis. >> /// Failure to do so will likely result in spurious diagnostics or failures >> /// during overload resolution or within sizeof/alignof/typeof/typeid. >> -bool Sema::DiagRuntimeBehavior(SourceLocation Loc, >> +bool Sema::DiagRuntimeBehavior(SourceLocation Loc, const Stmt *stmt, >> const PartialDiagnostic &PD) { >> switch (ExprEvalContexts.back().Context ) { >> case Unevaluated: >> >> Modified: cfe/trunk/lib/Sema/SemaStmt.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaStmt.cpp?rev=126286&r1=126285&r2=126286&view=diff >> ============================================================================== >> --- cfe/trunk/lib/Sema/SemaStmt.cpp (original) >> +++ cfe/trunk/lib/Sema/SemaStmt.cpp Tue Feb 22 19:51:43 2011 >> @@ -146,7 +146,7 @@ >> } >> } >> >> - DiagRuntimeBehavior(Loc, PDiag(DiagID) << R1 << R2); >> + DiagRuntimeBehavior(Loc, S, PDiag(DiagID) << R1 << R2); >> } >> >> StmtResult >> >> >> _______________________________________________ >> cfe-commits mailing list >> [email protected] >> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits > _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
