forked from OSchip/llvm-project
				
			Refactor CheckAdditionOperands(), CheckSubtractionOperands(), and CheckIncrementDecrementOperand() in SemaExpr.cpp to move reused code to separate functions.
llvm-svn: 138975
This commit is contained in:
		
							parent
							
								
									d7776ed030
								
							
						
					
					
						commit
						b10c631f53
					
				| 
						 | 
				
			
			@ -5822,6 +5822,30 @@ static bool checkArithmeticBinOpPointerOperands(Sema &S, SourceLocation Loc,
 | 
			
		|||
  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 Sema::CheckAdditionOperands( // C99 6.5.6
 | 
			
		|||
      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 Sema::CheckSubtractionOperands(ExprResult &lex, ExprResult &rex,
 | 
			
		|||
    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 @@ QualType Sema::CheckSubtractionOperands(ExprResult &lex, ExprResult &rex,
 | 
			
		|||
      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 @@ static QualType CheckIncrementDecrementOperand(Sema &S, Expr *Op,
 | 
			
		|||
  } 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)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue