diff options
| author | Chris Lattner <sabre@nondot.org> | 2008-11-21 07:05:48 +0000 | 
|---|---|---|
| committer | Chris Lattner <sabre@nondot.org> | 2008-11-21 07:05:48 +0000 | 
| commit | 6b0cf14ba43bef0b4f5c6005cd78e48b65e1c5f8 (patch) | |
| tree | d21c3cb5ca3b9205e175b7abd500b1905aa40a2a /clang/lib/Sema/SemaExpr.cpp | |
| parent | 85a94a04f43266a1d8c93a2f5314686e2c60bc0e (diff) | |
| download | bcm5719-llvm-6b0cf14ba43bef0b4f5c6005cd78e48b65e1c5f8.tar.gz bcm5719-llvm-6b0cf14ba43bef0b4f5c6005cd78e48b65e1c5f8.zip | |
Change CheckIncrementDecrementOperand to test for common cases first
and fall through better.
llvm-svn: 59799
Diffstat (limited to 'clang/lib/Sema/SemaExpr.cpp')
| -rw-r--r-- | clang/lib/Sema/SemaExpr.cpp | 45 | 
1 files changed, 24 insertions, 21 deletions
| diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index cb06b0fe667..ace5bcd5b70 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -2634,36 +2634,39 @@ QualType Sema::CheckCommaOperands(Expr *LHS, Expr *&RHS, SourceLocation Loc) {  /// CheckIncrementDecrementOperand - unlike most "Check" methods, this routine  /// doesn't need to call UsualUnaryConversions or UsualArithmeticConversions. -QualType Sema::CheckIncrementDecrementOperand(Expr *op, SourceLocation OpLoc) { -  QualType resType = op->getType(); -  assert(!resType.isNull() && "no type for increment/decrement expression"); +QualType Sema::CheckIncrementDecrementOperand(Expr *Op, SourceLocation OpLoc) { +  QualType ResType = Op->getType(); +  assert(!ResType.isNull() && "no type for increment/decrement expression");    // C99 6.5.2.4p1: We allow complex as a GCC extension. -  if (const PointerType *pt = resType->getAsPointerType()) { -    if (pt->getPointeeType()->isVoidType()) { -      Diag(OpLoc, diag::ext_gnu_void_ptr) << op->getSourceRange(); -    } else if (!pt->getPointeeType()->isObjectType()) { -      // C99 6.5.2.4p2, 6.5.6p2 +  if (ResType->isRealType()) { +    // OK! +  } else if (const PointerType *PT = ResType->getAsPointerType()) { +    // C99 6.5.2.4p2, 6.5.6p2 +    if (PT->getPointeeType()->isObjectType()) { +      // Pointer to object is ok! +    } else if (PT->getPointeeType()->isVoidType()) { +      // Pointer to void is extension. +      Diag(OpLoc, diag::ext_gnu_void_ptr) << Op->getSourceRange(); +    } else {        Diag(OpLoc, diag::err_typecheck_arithmetic_incomplete_type) -        << resType.getAsString() << op->getSourceRange(); -      return QualType(); -    } -  } else if (!resType->isRealType()) { -    if (resType->isComplexType())  -      // C99 does not support ++/-- on complex types. -      Diag(OpLoc, diag::ext_integer_increment_complex) -        << resType.getAsString() << op->getSourceRange(); -    else { -      Diag(OpLoc, diag::err_typecheck_illegal_increment_decrement) -        << resType.getAsString() << op->getSourceRange(); +        << ResType.getAsString() << Op->getSourceRange();        return QualType();      } +  } else if (ResType->isComplexType()) { +    // C99 does not support ++/-- on complex types, we allow as an extension. +    Diag(OpLoc, diag::ext_integer_increment_complex) +      << ResType.getAsString() << Op->getSourceRange(); +  } else { +    Diag(OpLoc, diag::err_typecheck_illegal_increment_decrement) +      << ResType.getAsString() << Op->getSourceRange(); +    return QualType();    }    // At this point, we know we have a real, complex or pointer type.     // Now make sure the operand is a modifiable lvalue. -  if (CheckForModifiableLvalue(op, OpLoc, *this)) +  if (CheckForModifiableLvalue(Op, OpLoc, *this))      return QualType(); -  return resType; +  return ResType;  }  /// getPrimaryDecl - Helper function for CheckAddressOfOperand(). | 

