[cfe-commits] r138975 - /cfe/trunk/lib/Sema/SemaExpr.cpp
Richard Trieu
rtrieu at google.com
Thu Sep 1 15:53:23 PDT 2011
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.
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;
+}
+
+/// \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();
+}
+
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());
}
} else {
// Pointee types must be compatible C99 6.5.6p3
if (!Context.typesAreCompatible(
Context.getCanonicalType(lpointee).getUnqualifiedType(),
Context.getCanonicalType(rpointee).getUnqualifiedType())) {
- Diag(Loc, diag::err_typecheck_sub_ptr_compatible)
- << lex.get()->getType() << rex.get()->getType()
- << lex.get()->getSourceRange() << rex.get()->getSourceRange();
+ diagnosePointerIncompatibility(*this, Loc, lex.get(), rex.get());
return QualType();
}
}
@@ -7001,18 +7014,13 @@
} else if (ResType->isRealType()) {
// OK!
} else if (ResType->isAnyPointerType()) {
- QualType PointeeTy = ResType->getPointeeType();
-
// C99 6.5.2.4p2, 6.5.6p2
if (!checkArithmeticOpPointerOperand(S, OpLoc, Op))
return QualType();
// Diagnose bad cases where we step over interface counts.
- else if (PointeeTy->isObjCObjectType() && S.LangOpts.ObjCNonFragileABI) {
- S.Diag(OpLoc, diag::err_arithmetic_nonfragile_interface)
- << PointeeTy << Op->getSourceRange();
+ else if (!checkArithmethicPointerOnNonFragileABI(S, OpLoc, Op))
return QualType();
- }
} else if (ResType->isAnyComplexType()) {
// C99 does not support ++/-- on complex types, we allow as an extension.
S.Diag(OpLoc, diag::ext_integer_increment_complex)
More information about the cfe-commits
mailing list