[cfe-commits] r138975 - /cfe/trunk/lib/Sema/SemaExpr.cpp
Sebastian Redl
sebastian.redl at getdesigned.at
Fri Sep 2 04:16:46 PDT 2011
On 02.09.2011 00:53, Richard Trieu wrote:
> Author: rtrieu
> Date: Thu Sep 1 17:53:23 2011
> New Revision: 138975
>
> URL: http://llvm.org/viewvc/llvm-project?rev=138975&view=rev
> Log:
> Refactor CheckAdditionOperands(), CheckSubtractionOperands(), and CheckIncrementDecrementOperand() in SemaExpr.cpp to move reused code to separate functions.
Beautiful. Some comments inline.
>
> Modified:
> cfe/trunk/lib/Sema/SemaExpr.cpp
>
> Modified: cfe/trunk/lib/Sema/SemaExpr.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExpr.cpp?rev=138975&r1=138974&r2=138975&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaExpr.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaExpr.cpp Thu Sep 1 17:53:23 2011
> @@ -5822,6 +5822,30 @@
> return true;
> }
>
> +/// \brief Check bad cases where we step over interface counts.
> +static bool checkArithmethicPointerOnNonFragileABI(Sema&S,
> + SourceLocation OpLoc,
> + Expr *Op) {
> + assert(Op->getType()->isAnyPointerType());
> + QualType PointeeTy = Op->getType()->getPointeeType();
> + if (!PointeeTy->isObjCObjectType() || !S.LangOpts.ObjCNonFragileABI)
> + return true;
> +
> + S.Diag(OpLoc, diag::err_arithmetic_nonfragile_interface)
> +<< PointeeTy<< Op->getSourceRange();
> + return false;
> +}
Clang's convention is to return true on error.
> +
> +/// \brief Warn when two pointers are incompatible.
> +static void diagnosePointerIncompatibility(Sema&S, SourceLocation Loc,
> + Expr *LHS, Expr *RHS) {
> + assert(LHS->getType()->isAnyPointerType());
> + assert(RHS->getType()->isAnyPointerType());
> + S.Diag(Loc, diag::err_typecheck_sub_ptr_compatible)
> +<< LHS->getType()<< RHS->getType()<< LHS->getSourceRange()
> +<< RHS->getSourceRange();
> +}
> +
The comment says "warn", the diagnostic says "err". Which is right?
> QualType Sema::CheckAdditionOperands( // C99 6.5.6
> ExprResult&lex, ExprResult&rex, SourceLocation Loc, QualType* CompLHSTy) {
> if (lex.get()->getType()->isVectorType() ||
> @@ -5855,11 +5879,8 @@
> QualType PointeeTy = PExp->getType()->getPointeeType();
>
> // Diagnose bad cases where we step over interface counts.
> - if (PointeeTy->isObjCObjectType()&& LangOpts.ObjCNonFragileABI) {
> - Diag(Loc, diag::err_arithmetic_nonfragile_interface)
> -<< PointeeTy<< PExp->getSourceRange();
> + if (!checkArithmethicPointerOnNonFragileABI(*this, Loc, PExp))
> return QualType();
> - }
>
> // Check array bounds for pointer arithemtic
> CheckArrayAccess(PExp, IExp);
> @@ -5909,11 +5930,8 @@
> QualType lpointee = lex.get()->getType()->getPointeeType();
>
> // Diagnose bad cases where we step over interface counts.
> - if (lpointee->isObjCObjectType()&& LangOpts.ObjCNonFragileABI) {
> - Diag(Loc, diag::err_arithmetic_nonfragile_interface)
> -<< lpointee<< lex.get()->getSourceRange();
> + if (!checkArithmethicPointerOnNonFragileABI(*this, Loc, lex.get()))
> return QualType();
> - }
>
> // The result type of a pointer-int computation is the pointer type.
> if (rex.get()->getType()->isIntegerType()) {
> @@ -5938,19 +5956,14 @@
> if (getLangOptions().CPlusPlus) {
> // Pointee types must be the same: C++ [expr.add]
> if (!Context.hasSameUnqualifiedType(lpointee, rpointee)) {
> - Diag(Loc, diag::err_typecheck_sub_ptr_compatible)
> -<< lex.get()->getType()<< rex.get()->getType()
> -<< lex.get()->getSourceRange()<< rex.get()->getSourceRange();
> - return QualType();
> + diagnosePointerIncompatibility(*this, Loc, lex.get(), rex.get());
What happened to the early return?
Sebastian
More information about the cfe-commits
mailing list