diff options
Diffstat (limited to 'lib/Sema/SemaChecking.cpp')
| -rw-r--r-- | lib/Sema/SemaChecking.cpp | 174 | 
1 files changed, 87 insertions, 87 deletions
diff --git a/lib/Sema/SemaChecking.cpp b/lib/Sema/SemaChecking.cpp index 8d953b6ef341..93dbeab5b034 100644 --- a/lib/Sema/SemaChecking.cpp +++ b/lib/Sema/SemaChecking.cpp @@ -119,7 +119,7 @@ static bool checkArgCount(Sema &S, CallExpr *call, unsigned desiredArgCount) {    // Highlight all the excess arguments.    SourceRange range(call->getArg(desiredArgCount)->getLocStart(),                      call->getArg(argCount - 1)->getLocEnd()); -     +    return S.Diag(range.getBegin(), diag::err_typecheck_call_too_many_args)      << 0 /*function call*/ << desiredArgCount << argCount      << call->getArg(1)->getSourceRange(); @@ -888,18 +888,18 @@ Sema::CheckBuiltinFunctionCall(FunctionDecl *FDecl, unsigned BuiltinID,    Context.GetBuiltinType(BuiltinID, Error, &ICEArguments);    if (Error != ASTContext::GE_None)      ICEArguments = 0;  // Don't diagnose previously diagnosed errors. -   +    // If any arguments are required to be ICE's, check and diagnose.    for (unsigned ArgNo = 0; ICEArguments != 0; ++ArgNo) {      // Skip arguments not required to be ICE's.      if ((ICEArguments & (1 << ArgNo)) == 0) continue; -     +      llvm::APSInt Result;      if (SemaBuiltinConstantArg(TheCall, ArgNo, Result))        return true;      ICEArguments &= ~(1 << ArgNo);    } -   +    switch (BuiltinID) {    case Builtin::BI__builtin___CFStringMakeConstantString:      assert(TheCall->getNumArgs() == 1 && @@ -3850,7 +3850,7 @@ DiagnoseCStringFormatDirectiveInCFAPI(Sema &S,  static bool isNonNullType(ASTContext &ctx, QualType type) {    if (auto nullability = type->getNullability(ctx))      return *nullability == NullabilityKind::NonNull; -      +    return false;  } @@ -3893,12 +3893,12 @@ static void CheckNonNullArguments(Sema &S,        parms = FD->parameters();      else        parms = cast<ObjCMethodDecl>(FDecl)->parameters(); -     +      unsigned ParamIndex = 0;      for (ArrayRef<ParmVarDecl*>::iterator I = parms.begin(), E = parms.end();           I != E; ++I, ++ParamIndex) {        const ParmVarDecl *PVD = *I; -      if (PVD->hasAttr<NonNullAttr>() ||  +      if (PVD->hasAttr<NonNullAttr>() ||            isNonNullType(S.Context, PVD->getType())) {          if (NonNullArgs.empty())            NonNullArgs.resize(Args.size()); @@ -3920,7 +3920,7 @@ static void CheckNonNullArguments(Sema &S,          // Dig out the function prototype, if there is one.          Proto = type->getAs<FunctionProtoType>(); -      }  +      }      }      // Fill in non-null argument information from the nullability @@ -3931,17 +3931,17 @@ static void CheckNonNullArguments(Sema &S,          if (isNonNullType(S.Context, paramType)) {            if (NonNullArgs.empty())              NonNullArgs.resize(Args.size()); -           +            NonNullArgs.set(Index);          } -         +          ++Index;        }      }    }    // Check for non-null arguments. -  for (unsigned ArgIndex = 0, ArgIndexEnd = NonNullArgs.size();  +  for (unsigned ArgIndex = 0, ArgIndexEnd = NonNullArgs.size();         ArgIndex != ArgIndexEnd; ++ArgIndex) {      if (NonNullArgs[ArgIndex])        CheckNonNullArgument(S, Args[ArgIndex], CallSiteLoc); @@ -4074,7 +4074,7 @@ bool Sema::CheckFunctionCall(FunctionDecl *FDecl, CallExpr *TheCall,    return false;  } -bool Sema::CheckObjCMethodCall(ObjCMethodDecl *Method, SourceLocation lbrac,  +bool Sema::CheckObjCMethodCall(ObjCMethodDecl *Method, SourceLocation lbrac,                                 ArrayRef<const Expr *> Args) {    VariadicCallType CallType =        Method->isVariadic() ? VariadicMethod : VariadicDoesNotApply; @@ -4577,7 +4577,7 @@ ExprResult Sema::SemaAtomicOpsOverloaded(ExprResult TheCallResult,    AtomicExpr *AE = new (Context) AtomicExpr(TheCall->getCallee()->getLocStart(),                                              SubExprs, ResultType, Op,                                              TheCall->getRParenLoc()); -   +    if ((Op == AtomicExpr::AO__c11_atomic_load ||         Op == AtomicExpr::AO__c11_atomic_store ||         Op == AtomicExpr::AO__opencl_atomic_load || @@ -4744,52 +4744,52 @@ Sema::SemaBuiltinAtomicOverloaded(ExprResult TheCallResult) {    bool WarnAboutSemanticsChange = false;    switch (BuiltinID) {    default: llvm_unreachable("Unknown overloaded atomic builtin!"); -  case Builtin::BI__sync_fetch_and_add:  +  case Builtin::BI__sync_fetch_and_add:    case Builtin::BI__sync_fetch_and_add_1:    case Builtin::BI__sync_fetch_and_add_2:    case Builtin::BI__sync_fetch_and_add_4:    case Builtin::BI__sync_fetch_and_add_8:    case Builtin::BI__sync_fetch_and_add_16: -    BuiltinIndex = 0;  +    BuiltinIndex = 0;      break; -       -  case Builtin::BI__sync_fetch_and_sub:  + +  case Builtin::BI__sync_fetch_and_sub:    case Builtin::BI__sync_fetch_and_sub_1:    case Builtin::BI__sync_fetch_and_sub_2:    case Builtin::BI__sync_fetch_and_sub_4:    case Builtin::BI__sync_fetch_and_sub_8:    case Builtin::BI__sync_fetch_and_sub_16: -    BuiltinIndex = 1;  +    BuiltinIndex = 1;      break; -       -  case Builtin::BI__sync_fetch_and_or:   + +  case Builtin::BI__sync_fetch_and_or:    case Builtin::BI__sync_fetch_and_or_1:    case Builtin::BI__sync_fetch_and_or_2:    case Builtin::BI__sync_fetch_and_or_4:    case Builtin::BI__sync_fetch_and_or_8:    case Builtin::BI__sync_fetch_and_or_16: -    BuiltinIndex = 2;  +    BuiltinIndex = 2;      break; -       -  case Builtin::BI__sync_fetch_and_and:  + +  case Builtin::BI__sync_fetch_and_and:    case Builtin::BI__sync_fetch_and_and_1:    case Builtin::BI__sync_fetch_and_and_2:    case Builtin::BI__sync_fetch_and_and_4:    case Builtin::BI__sync_fetch_and_and_8:    case Builtin::BI__sync_fetch_and_and_16: -    BuiltinIndex = 3;  +    BuiltinIndex = 3;      break; -  case Builtin::BI__sync_fetch_and_xor:  +  case Builtin::BI__sync_fetch_and_xor:    case Builtin::BI__sync_fetch_and_xor_1:    case Builtin::BI__sync_fetch_and_xor_2:    case Builtin::BI__sync_fetch_and_xor_4:    case Builtin::BI__sync_fetch_and_xor_8:    case Builtin::BI__sync_fetch_and_xor_16: -    BuiltinIndex = 4;  +    BuiltinIndex = 4;      break; -  case Builtin::BI__sync_fetch_and_nand:  +  case Builtin::BI__sync_fetch_and_nand:    case Builtin::BI__sync_fetch_and_nand_1:    case Builtin::BI__sync_fetch_and_nand_2:    case Builtin::BI__sync_fetch_and_nand_4: @@ -4799,43 +4799,43 @@ Sema::SemaBuiltinAtomicOverloaded(ExprResult TheCallResult) {      WarnAboutSemanticsChange = true;      break; -  case Builtin::BI__sync_add_and_fetch:  +  case Builtin::BI__sync_add_and_fetch:    case Builtin::BI__sync_add_and_fetch_1:    case Builtin::BI__sync_add_and_fetch_2:    case Builtin::BI__sync_add_and_fetch_4:    case Builtin::BI__sync_add_and_fetch_8:    case Builtin::BI__sync_add_and_fetch_16: -    BuiltinIndex = 6;  +    BuiltinIndex = 6;      break; -       -  case Builtin::BI__sync_sub_and_fetch:  + +  case Builtin::BI__sync_sub_and_fetch:    case Builtin::BI__sync_sub_and_fetch_1:    case Builtin::BI__sync_sub_and_fetch_2:    case Builtin::BI__sync_sub_and_fetch_4:    case Builtin::BI__sync_sub_and_fetch_8:    case Builtin::BI__sync_sub_and_fetch_16: -    BuiltinIndex = 7;  +    BuiltinIndex = 7;      break; -       -  case Builtin::BI__sync_and_and_fetch:  + +  case Builtin::BI__sync_and_and_fetch:    case Builtin::BI__sync_and_and_fetch_1:    case Builtin::BI__sync_and_and_fetch_2:    case Builtin::BI__sync_and_and_fetch_4:    case Builtin::BI__sync_and_and_fetch_8:    case Builtin::BI__sync_and_and_fetch_16: -    BuiltinIndex = 8;  +    BuiltinIndex = 8;      break; -       -  case Builtin::BI__sync_or_and_fetch:   + +  case Builtin::BI__sync_or_and_fetch:    case Builtin::BI__sync_or_and_fetch_1:    case Builtin::BI__sync_or_and_fetch_2:    case Builtin::BI__sync_or_and_fetch_4:    case Builtin::BI__sync_or_and_fetch_8:    case Builtin::BI__sync_or_and_fetch_16: -    BuiltinIndex = 9;  +    BuiltinIndex = 9;      break; -       -  case Builtin::BI__sync_xor_and_fetch:  + +  case Builtin::BI__sync_xor_and_fetch:    case Builtin::BI__sync_xor_and_fetch_1:    case Builtin::BI__sync_xor_and_fetch_2:    case Builtin::BI__sync_xor_and_fetch_4: @@ -4844,7 +4844,7 @@ Sema::SemaBuiltinAtomicOverloaded(ExprResult TheCallResult) {      BuiltinIndex = 10;      break; -  case Builtin::BI__sync_nand_and_fetch:  +  case Builtin::BI__sync_nand_and_fetch:    case Builtin::BI__sync_nand_and_fetch_1:    case Builtin::BI__sync_nand_and_fetch_2:    case Builtin::BI__sync_nand_and_fetch_4: @@ -4863,7 +4863,7 @@ Sema::SemaBuiltinAtomicOverloaded(ExprResult TheCallResult) {      BuiltinIndex = 12;      NumFixed = 2;      break; -       +    case Builtin::BI__sync_bool_compare_and_swap:    case Builtin::BI__sync_bool_compare_and_swap_1:    case Builtin::BI__sync_bool_compare_and_swap_2: @@ -4874,16 +4874,16 @@ Sema::SemaBuiltinAtomicOverloaded(ExprResult TheCallResult) {      NumFixed = 2;      ResultType = Context.BoolTy;      break; -       +    case Builtin::BI__sync_lock_test_and_set:    case Builtin::BI__sync_lock_test_and_set_1:    case Builtin::BI__sync_lock_test_and_set_2:    case Builtin::BI__sync_lock_test_and_set_4:    case Builtin::BI__sync_lock_test_and_set_8:    case Builtin::BI__sync_lock_test_and_set_16: -    BuiltinIndex = 14;  +    BuiltinIndex = 14;      break; -       +    case Builtin::BI__sync_lock_release:    case Builtin::BI__sync_lock_release_1:    case Builtin::BI__sync_lock_release_2: @@ -4894,14 +4894,14 @@ Sema::SemaBuiltinAtomicOverloaded(ExprResult TheCallResult) {      NumFixed = 0;      ResultType = Context.VoidTy;      break; -       -  case Builtin::BI__sync_swap:  + +  case Builtin::BI__sync_swap:    case Builtin::BI__sync_swap_1:    case Builtin::BI__sync_swap_2:    case Builtin::BI__sync_swap_4:    case Builtin::BI__sync_swap_8:    case Builtin::BI__sync_swap_16: -    BuiltinIndex = 16;  +    BuiltinIndex = 16;      break;    } @@ -5410,7 +5410,7 @@ bool Sema::SemaBuiltinFPClassification(CallExpr *TheCall, unsigned NumArgs) {        }      }    } -   +    return false;  } @@ -5787,13 +5787,13 @@ bool Sema::SemaBuiltinConstantArg(CallExpr *TheCall, int ArgNum,    Expr *Arg = TheCall->getArg(ArgNum);    DeclRefExpr *DRE =cast<DeclRefExpr>(TheCall->getCallee()->IgnoreParenCasts());    FunctionDecl *FDecl = cast<FunctionDecl>(DRE->getDecl()); -   +    if (Arg->isTypeDependent() || Arg->isValueDependent()) return false; -   +    if (!Arg->isIntegerConstantExpr(Result, Context))      return Diag(TheCall->getLocStart(), diag::err_constant_integer_arg_type)                  << FDecl->getDeclName() <<  Arg->getSourceRange(); -   +    return false;  } @@ -5964,7 +5964,7 @@ bool Sema::SemaBuiltinLongjmp(CallExpr *TheCall) {    // TODO: This is less than ideal. Overload this to take a value.    if (SemaBuiltinConstantArg(TheCall, 1, Result))      return true; -   +    if (Result != 1)      return Diag(TheCall->getLocStart(), diag::err_builtin_longjmp_invalid_val)               << SourceRange(Arg->getLocStart(), Arg->getLocEnd()); @@ -6231,7 +6231,7 @@ checkFormatStringExpr(Sema &S, const Expr *E, ArrayRef<const Expr *> Args,      // cannot contain format specifiers and thus are not a security      // liability.      return SLCT_UncheckedLiteral; -       +    case Stmt::DeclRefExprClass: {      const DeclRefExpr *DR = cast<DeclRefExpr>(E); @@ -6626,14 +6626,14 @@ protected:    void HandlePositionalNonpositionalArgs(SourceLocation Loc,                                           const char *startSpec,                                           unsigned specifierLen); -   +    SourceRange getFormatStringRange();    CharSourceRange getSpecifierRange(const char *startSpecifier,                                      unsigned specifierLen);    SourceLocation getLocationOfByte(const char *x);    const Expr *getDataArg(unsigned i) const; -   +    bool CheckNumArgs(const analyze_format_string::FormatSpecifier &FS,                      const analyze_format_string::ConversionSpecifier &CS,                      const char *startSpecifier, unsigned specifierLen, @@ -7052,7 +7052,7 @@ public:                           const char *startSpecifier, unsigned specifierLen);    bool checkForCStrMembers(const analyze_printf::ArgType &AT,                             const Expr *E); -                            +    void HandleEmptyObjCModifierFlag(const char *startFlag,                                     unsigned flagLen) override; @@ -7061,7 +7061,7 @@ public:    void HandleObjCFlagsWithNonObjCConversion(const char *flagsStart,                                             const char *flagsEnd, -                                           const char *conversionPosition)  +                                           const char *conversionPosition)                                               override;  }; @@ -7073,7 +7073,7 @@ bool CheckPrintfHandler::HandleInvalidPrintfConversionSpecifier(                                        unsigned specifierLen) {    const analyze_printf::PrintfConversionSpecifier &CS =      FS.getConversionSpecifier(); -   +    return HandleInvalidConversionSpecifier(FS.getArgIndex(),                                            getLocationOfByte(CS.getStart()),                                            startSpecifier, specifierLen, @@ -7736,7 +7736,7 @@ CheckPrintfHandler::checkFormatExpr(const analyze_printf::PrintfSpecifier &FS,        CastFix << ")";        SmallVector<FixItHint,4> Hints; -      if (!AT.matchesType(S.Context, IntendedTy) || ShouldNotPrintDirectly)  +      if (!AT.matchesType(S.Context, IntendedTy) || ShouldNotPrintDirectly)          Hints.push_back(FixItHint::CreateReplacement(SpecRange, os.str()));        if (const CStyleCastExpr *CCast = dyn_cast<CStyleCastExpr>(E)) { @@ -7777,7 +7777,7 @@ CheckPrintfHandler::checkFormatExpr(const analyze_printf::PrintfSpecifier &FS,                               SpecRange, Hints);        } else {          // In this case, the expression could be printed using a different -        // specifier, but we've decided that the specifier is probably correct  +        // specifier, but we've decided that the specifier is probably correct          // and we should cast instead. Just use the normal warning message.          EmitFormatDiagnostic(            S.PDiag(diag::warn_format_conversion_argument_type_mismatch) @@ -7852,7 +7852,7 @@ CheckPrintfHandler::checkFormatExpr(const analyze_printf::PrintfSpecifier &FS,  //===--- CHECK: Scanf format string checking ------------------------------===// -namespace {   +namespace {  class CheckScanfHandler : public CheckFormatHandler {  public: @@ -7872,7 +7872,7 @@ public:    bool HandleScanfSpecifier(const analyze_scanf::ScanfSpecifier &FS,                              const char *startSpecifier,                              unsigned specifierLen) override; -   +    bool HandleInvalidScanfConversionSpecifier(            const analyze_scanf::ScanfSpecifier &FS,            const char *startSpecifier, @@ -7908,7 +7908,7 @@ bool CheckScanfHandler::HandleScanfSpecifier(                                         const char *startSpecifier,                                         unsigned specifierLen) {    using namespace analyze_scanf; -  using namespace analyze_format_string;   +  using namespace analyze_format_string;    const ScanfConversionSpecifier &CS = FS.getConversionSpecifier(); @@ -7925,7 +7925,7 @@ bool CheckScanfHandler::HandleScanfSpecifier(        return false;      }    } -   +    // Check if the field with is non-zero.    const OptionalAmount &Amt = FS.getFieldWidth();    if (Amt.getHowSpecified() == OptionalAmount::Constant) { @@ -8981,7 +8981,7 @@ void Sema::CheckMemaccessArguments(const CallExpr *Call,          else if (BId == Builtin::BImemcmp)            OperationType = 3;        } -         +        DiagRuntimeBehavior(          Dest->getExprLoc(), Dest,          PDiag(diag::warn_dyn_class_memaccess) @@ -9035,7 +9035,7 @@ static const Expr *ignoreLiteralAdditions(const Expr *Ex, ASTContext &Ctx) {      const Expr *RHS = BO->getRHS()->IgnoreParenCasts();      const Expr *LHS = BO->getLHS()->IgnoreParenCasts(); -     +      if (isa<IntegerLiteral>(RHS))        Ex = LHS;      else if (isa<IntegerLiteral>(LHS)) @@ -9077,7 +9077,7 @@ void Sema::CheckStrlcpycatArguments(const CallExpr *Call,    if (CheckMemorySizeofForComparison(*this, SizeArg, FnName,                                       Call->getLocStart(), Call->getRParenLoc()))      return; -   +    // Look for 'strlcpy(dst, x, sizeof(x))'    if (const Expr *Ex = getSizeOfExprArg(SizeArg))      CompareWithSrc = Ex; @@ -9100,16 +9100,16 @@ void Sema::CheckStrlcpycatArguments(const CallExpr *Call,    const DeclRefExpr *SrcArgDRE = dyn_cast<DeclRefExpr>(SrcArg);    if (!SrcArgDRE)      return; -   +    const DeclRefExpr *CompareWithSrcDRE = dyn_cast<DeclRefExpr>(CompareWithSrc); -  if (!CompareWithSrcDRE ||  +  if (!CompareWithSrcDRE ||        SrcArgDRE->getDecl() != CompareWithSrcDRE->getDecl())      return; -   +    const Expr *OriginalSizeArg = Call->getArg(2);    Diag(CompareWithSrcDRE->getLocStart(), diag::warn_strlcpycat_wrong_size)      << OriginalSizeArg->getSourceRange() << FnName; -   +    // Output a FIXIT hint if the destination is an array (rather than a    // pointer to an array).  This could be enhanced to handle some    // pointers if we know the actual size, like if DstArg is 'array+2' @@ -9123,7 +9123,7 @@ void Sema::CheckStrlcpycatArguments(const CallExpr *Call,    OS << "sizeof(";    DstArg->printPretty(OS, nullptr, getPrintingPolicy());    OS << ")"; -   +    Diag(OriginalSizeArg->getLocStart(), diag::note_strlcpycat_wrong_size)      << FixItHint::CreateReplacement(OriginalSizeArg->getSourceRange(),                                      OS.str()); @@ -10271,7 +10271,7 @@ static void AnalyzeAssignment(Sema &S, BinaryOperator *E) {  }  /// Diagnose an implicit cast;  purely a helper for CheckImplicitConversion. -static void DiagnoseImpCast(Sema &S, Expr *E, QualType SourceType, QualType T,  +static void DiagnoseImpCast(Sema &S, Expr *E, QualType SourceType, QualType T,                              SourceLocation CContext, unsigned diag,                              bool pruneControlFlow = false) {    if (pruneControlFlow) { @@ -10876,7 +10876,7 @@ CheckImplicitConversion(Sema &S, Expr *E, QualType T, SourceLocation CC,      // We also want to warn about it in -Wconversion.      // So if -Wconversion is off, use a completely identical diagnostic      // in the sign-compare group. -    // The conditional-checking code will  +    // The conditional-checking code will      if (ICContext) {        DiagID = diag::warn_impcast_integer_sign_conditional;        *ICContext = true; @@ -10897,7 +10897,7 @@ CheckImplicitConversion(Sema &S, Expr *E, QualType T, SourceLocation CC,          Source = S.Context.getCanonicalType(SourceType).getTypePtr();        }    } -   +    if (const EnumType *SourceEnum = Source->getAs<EnumType>())      if (const EnumType *TargetEnum = Target->getAs<EnumType>())        if (SourceEnum->getDecl()->hasNameForLinkage() && @@ -10906,7 +10906,7 @@ CheckImplicitConversion(Sema &S, Expr *E, QualType T, SourceLocation CC,          if (S.SourceMgr.isInSystemMacro(CC))            return; -        return DiagnoseImpCast(S, E, SourceType, T, CC,  +        return DiagnoseImpCast(S, E, SourceType, T, CC,                                 diag::warn_impcast_different_enum_types);        }  } @@ -10945,7 +10945,7 @@ static void CheckConditionalOperator(Sema &S, ConditionalOperator *E,    // ...then check whether it would have warned about either of the    // candidates for a signedness conversion to the condition type.    if (E->getType() == T) return; -  +    Suspicious = false;    CheckImplicitConversion(S, E->getTrueExpr()->IgnoreParenImpCasts(),                            E->getType(), CC, &Suspicious); @@ -12426,11 +12426,11 @@ namespace {      }      void VisitBlockExpr(BlockExpr *block) { -      // Look inside nested blocks  +      // Look inside nested blocks        if (block->getBlockDecl()->capturesVariable(Variable))          Visit(block->getBlockDecl()->getBody());      } -     +      void VisitOpaqueValueExpr(OpaqueValueExpr *OVE) {        if (Capturer) return;        if (OVE->getSourceExpr()) @@ -12483,7 +12483,7 @@ static Expr *findCapturingExpr(Sema &S, Expr *e, RetainCycleOwner &owner) {        }      }    } -   +    BlockExpr *block = dyn_cast<BlockExpr>(e);    if (!block || !block->getBlockDecl()->capturesVariable(owner.Variable))      return nullptr; @@ -12736,12 +12736,12 @@ void Sema::checkRetainCycles(VarDecl *Var, Expr *Init) {    RetainCycleOwner Owner;    if (!considerVariable(Var, /*DeclRefExpr=*/nullptr, Owner))      return; -   +    // Because we don't have an expression for the variable, we have to set the    // location explicitly here.    Owner.Loc = Var->getLocation();    Owner.Range = Var->getSourceRange(); -   +    if (Expr *Capturer = findCapturingExpr(*this, Init, Owner))      diagnoseRetainCycle(*this, Capturer, Owner);  } @@ -12814,7 +12814,7 @@ void Sema::checkUnsafeExprAssigns(SourceLocation Loc,      if (PD)        LHSType = PD->getType();    } -   +    if (LHSType.isNull())      LHSType = LHS->getType(); @@ -12831,14 +12831,14 @@ void Sema::checkUnsafeExprAssigns(SourceLocation Loc,    // FIXME. Check for other life times.    if (LT != Qualifiers::OCL_None)      return; -   +    if (PRE) {      if (PRE->isImplicitProperty())        return;      const ObjCPropertyDecl *PD = PRE->getExplicitProperty();      if (!PD)        return; -     +      unsigned Attributes = PD->getPropertyAttributes();      if (Attributes & ObjCPropertyDecl::OBJC_PR_assign) {        // when 'assign' attribute was not explicitly specified @@ -12848,7 +12848,7 @@ void Sema::checkUnsafeExprAssigns(SourceLocation Loc,        if (!(AsWrittenAttr & ObjCPropertyDecl::OBJC_PR_assign) &&            LHSType->isObjCRetainableType())          return; -         +        while (ImplicitCastExpr *cast = dyn_cast<ImplicitCastExpr>(RHS)) {          if (cast->getCastKind() == CK_ARCConsumeObject) {            Diag(Loc, diag::warn_arc_retained_property_assign)  | 
