PExp->getType()->isObjCObjectPointerType()) {
if (IExp->getType()->isIntegerType()) {
- QualType PointeeTy;
- const PointerType *PTy = NULL;
- const ObjCObjectPointerType *OPT = NULL;
+ QualType PointeeTy = PExp->getType()->getPointeeType();
- if ((PTy = PExp->getType()->getAsPointerType()))
- PointeeTy = PTy->getPointeeType();
- else if ((OPT = PExp->getType()->getAsObjCObjectPointerType()))
- PointeeTy = OPT->getPointeeType();
-
// Check for arithmetic on pointers to incomplete types.
if (PointeeTy->isVoidType()) {
if (getLangOptions().CPlusPlus) {
// GNU extension: arithmetic on pointer to function
Diag(Loc, diag::ext_gnu_ptr_func_arith)
<< lex->getType() << lex->getSourceRange();
- } else if (((PTy && !PTy->isDependentType()) || OPT) &&
- RequireCompleteType(Loc, PointeeTy,
- diag::err_typecheck_arithmetic_incomplete_type,
- PExp->getSourceRange(), SourceRange(),
- PExp->getType()))
- return QualType();
-
+ } else {
+ // Check if we require a complete type.
+ if (((PExp->getType()->isPointerType() &&
+ !PExp->getType()->getAsPointerType()->isDependentType()) ||
+ PExp->getType()->isObjCObjectPointerType()) &&
+ RequireCompleteType(Loc, PointeeTy,
+ diag::err_typecheck_arithmetic_incomplete_type,
+ PExp->getSourceRange(), SourceRange(),
+ PExp->getType()))
+ return QualType();
+ }
// Diagnose bad cases where we step over interface counts.
if (PointeeTy->isObjCInterfaceType() && LangOpts.ObjCNonFragileABI) {
Diag(Loc, diag::err_arithmetic_nonfragile_interface)