diff options
Diffstat (limited to 'contrib/llvm/tools/clang/lib/Sema/SemaPseudoObject.cpp')
-rw-r--r-- | contrib/llvm/tools/clang/lib/Sema/SemaPseudoObject.cpp | 249 |
1 files changed, 142 insertions, 107 deletions
diff --git a/contrib/llvm/tools/clang/lib/Sema/SemaPseudoObject.cpp b/contrib/llvm/tools/clang/lib/Sema/SemaPseudoObject.cpp index af74f0d..aa3e89e 100644 --- a/contrib/llvm/tools/clang/lib/Sema/SemaPseudoObject.cpp +++ b/contrib/llvm/tools/clang/lib/Sema/SemaPseudoObject.cpp @@ -31,6 +31,7 @@ //===----------------------------------------------------------------------===// #include "clang/Sema/SemaInternal.h" +#include "clang/AST/ExprCXX.h" #include "clang/AST/ExprObjC.h" #include "clang/Basic/CharInfo.h" #include "clang/Lex/Preprocessor.h" @@ -235,7 +236,10 @@ namespace { } /// Return true if assignments have a non-void result. - bool CanCaptureValueOfType(QualType ty) { + bool CanCaptureValue(Expr *exp) { + if (exp->isGLValue()) + return true; + QualType ty = exp->getType(); assert(!ty->isIncompleteType()); assert(!ty->isDependentType()); @@ -264,7 +268,8 @@ namespace { public: ObjCPropertyOpBuilder(Sema &S, ObjCPropertyRefExpr *refExpr) : PseudoOpBuilder(S, refExpr->getLocation()), RefExpr(refExpr), - SyntacticRefExpr(0), InstanceReceiver(0), Getter(0), Setter(0) { + SyntacticRefExpr(nullptr), InstanceReceiver(nullptr), Getter(nullptr), + Setter(nullptr) { } ExprResult buildRValueOperation(Expr *op); @@ -279,11 +284,12 @@ namespace { bool tryBuildGetOfReference(Expr *op, ExprResult &result); bool findSetter(bool warn=true); bool findGetter(); + void DiagnoseUnsupportedPropertyUse(); - Expr *rebuildAndCaptureObject(Expr *syntacticBase); - ExprResult buildGet(); - ExprResult buildSet(Expr *op, SourceLocation, bool); - ExprResult complete(Expr *SyntacticForm); + Expr *rebuildAndCaptureObject(Expr *syntacticBase) override; + ExprResult buildGet() override; + ExprResult buildSet(Expr *op, SourceLocation, bool) override; + ExprResult complete(Expr *SyntacticForm) override; bool isWeakProperty() const; }; @@ -303,21 +309,21 @@ namespace { ObjCSubscriptOpBuilder(Sema &S, ObjCSubscriptRefExpr *refExpr) : PseudoOpBuilder(S, refExpr->getSourceRange().getBegin()), RefExpr(refExpr), - InstanceBase(0), InstanceKey(0), - AtIndexGetter(0), AtIndexSetter(0) { } - + InstanceBase(nullptr), InstanceKey(nullptr), + AtIndexGetter(nullptr), AtIndexSetter(nullptr) {} + ExprResult buildRValueOperation(Expr *op); ExprResult buildAssignmentOperation(Scope *Sc, SourceLocation opLoc, BinaryOperatorKind opcode, Expr *LHS, Expr *RHS); - Expr *rebuildAndCaptureObject(Expr *syntacticBase); - + Expr *rebuildAndCaptureObject(Expr *syntacticBase) override; + bool findAtIndexGetter(); bool findAtIndexSetter(); - - ExprResult buildGet(); - ExprResult buildSet(Expr *op, SourceLocation, bool); + + ExprResult buildGet() override; + ExprResult buildSet(Expr *op, SourceLocation, bool) override; }; class MSPropertyOpBuilder : public PseudoOpBuilder { @@ -328,9 +334,9 @@ namespace { PseudoOpBuilder(S, refExpr->getSourceRange().getBegin()), RefExpr(refExpr) {} - Expr *rebuildAndCaptureObject(Expr *); - ExprResult buildGet(); - ExprResult buildSet(Expr *op, SourceLocation, bool); + Expr *rebuildAndCaptureObject(Expr *) override; + ExprResult buildGet() override; + ExprResult buildSet(Expr *op, SourceLocation, bool) override; }; } @@ -388,7 +394,7 @@ ExprResult PseudoOpBuilder::buildRValueOperation(Expr *op) { ExprResult getExpr = buildGet(); if (getExpr.isInvalid()) return ExprError(); - addResultSemanticExpr(getExpr.take()); + addResultSemanticExpr(getExpr.get()); return complete(syntacticBase); } @@ -421,7 +427,7 @@ PseudoOpBuilder::buildAssignmentOperation(Scope *Sc, SourceLocation opcLoc, BinaryOperatorKind nonCompound = BinaryOperator::getOpForCompoundAssignment(opcode); result = S.BuildBinOp(Sc, opcLoc, nonCompound, - opLHS.take(), capturedRHS); + opLHS.get(), capturedRHS); if (result.isInvalid()) return ExprError(); syntactic = @@ -436,9 +442,9 @@ PseudoOpBuilder::buildAssignmentOperation(Scope *Sc, SourceLocation opcLoc, // The result of the assignment, if not void, is the value set into // the l-value. - result = buildSet(result.take(), opcLoc, /*captureSetValueAsResult*/ true); + result = buildSet(result.get(), opcLoc, /*captureSetValueAsResult*/ true); if (result.isInvalid()) return ExprError(); - addSemanticExpr(result.take()); + addSemanticExpr(result.get()); return complete(syntactic); } @@ -461,8 +467,8 @@ PseudoOpBuilder::buildIncDecOperation(Scope *Sc, SourceLocation opcLoc, // That's the postfix result. if (UnaryOperator::isPostfix(opcode) && - (result.get()->isTypeDependent() || CanCaptureValueOfType(resultType))) { - result = capture(result.take()); + (result.get()->isTypeDependent() || CanCaptureValue(result.get()))) { + result = capture(result.get()); setResultToLastSemantic(); } @@ -472,17 +478,17 @@ PseudoOpBuilder::buildIncDecOperation(Scope *Sc, SourceLocation opcLoc, GenericLoc); if (UnaryOperator::isIncrementOp(opcode)) { - result = S.BuildBinOp(Sc, opcLoc, BO_Add, result.take(), one); + result = S.BuildBinOp(Sc, opcLoc, BO_Add, result.get(), one); } else { - result = S.BuildBinOp(Sc, opcLoc, BO_Sub, result.take(), one); + result = S.BuildBinOp(Sc, opcLoc, BO_Sub, result.get(), one); } if (result.isInvalid()) return ExprError(); // Store that back into the result. The value stored is the result // of a prefix operation. - result = buildSet(result.take(), opcLoc, UnaryOperator::isPrefix(opcode)); + result = buildSet(result.get(), opcLoc, UnaryOperator::isPrefix(opcode)); if (result.isInvalid()) return ExprError(); - addSemanticExpr(result.take()); + addSemanticExpr(result.get()); UnaryOperator *syntactic = new (S.Context) UnaryOperator(syntacticOp, opcode, resultType, @@ -536,11 +542,11 @@ bool ObjCPropertyOpBuilder::isWeakProperty() const { if (RefExpr->isExplicitProperty()) { const ObjCPropertyDecl *Prop = RefExpr->getExplicitProperty(); if (Prop->getPropertyAttributes() & ObjCPropertyDecl::OBJC_PR_weak) - return true; + return !Prop->hasAttr<IBOutletAttr>(); T = Prop->getType(); } else if (Getter) { - T = Getter->getResultType(); + T = Getter->getReturnType(); } else { return false; } @@ -563,19 +569,17 @@ bool ObjCPropertyOpBuilder::findGetter() { assert(setter && "both setter and getter are null - cannot happen"); IdentifierInfo *setterName = setter->getSelector().getIdentifierInfoForSlot(0); - const char *compStr = setterName->getNameStart(); - compStr += 3; - IdentifierInfo *getterName = &S.Context.Idents.get(compStr); + IdentifierInfo *getterName = + &S.Context.Idents.get(setterName->getName().substr(3)); GetterSelector = S.PP.getSelectorTable().getNullarySelector(getterName); return false; - } } ObjCPropertyDecl *prop = RefExpr->getExplicitProperty(); Getter = LookupMethodInReceiverType(S, prop->getGetterName(), RefExpr); - return (Getter != 0); + return (Getter != nullptr); } /// Try to find the most accurate setter declaration for the property @@ -621,7 +625,7 @@ bool ObjCPropertyOpBuilder::findSetter(bool warn) { if (ObjCPropertyDecl *prop1 = IFace->FindPropertyDeclaration(AltMember)) if (prop != prop1 && (prop1->getSetterMethodDecl() == setter)) { S.Diag(RefExpr->getExprLoc(), diag::error_property_setter_ambiguous_use) - << prop->getName() << prop1->getName() << setter->getSelector(); + << prop << prop1 << setter->getSelector(); S.Diag(prop->getLocation(), diag::note_property_declare); S.Diag(prop1->getLocation(), diag::note_property_declare); } @@ -638,9 +642,21 @@ bool ObjCPropertyOpBuilder::findSetter(bool warn) { return false; } +void ObjCPropertyOpBuilder::DiagnoseUnsupportedPropertyUse() { + if (S.getCurLexicalContext()->isObjCContainer() && + S.getCurLexicalContext()->getDeclKind() != Decl::ObjCCategoryImpl && + S.getCurLexicalContext()->getDeclKind() != Decl::ObjCImplementation) { + if (ObjCPropertyDecl *prop = RefExpr->getExplicitProperty()) { + S.Diag(RefExpr->getLocation(), + diag::err_property_function_in_objc_container); + S.Diag(prop->getLocation(), diag::note_property_declare); + } + } +} + /// Capture the base object of an Objective-C property expression. Expr *ObjCPropertyOpBuilder::rebuildAndCaptureObject(Expr *syntacticBase) { - assert(InstanceReceiver == 0); + assert(InstanceReceiver == nullptr); // If we have a base, capture it in an OVE and rebuild the syntactic // form to use the OVE as its base. @@ -661,7 +677,10 @@ Expr *ObjCPropertyOpBuilder::rebuildAndCaptureObject(Expr *syntacticBase) { /// Load from an Objective-C property reference. ExprResult ObjCPropertyOpBuilder::buildGet() { findGetter(); - assert(Getter); + if (!Getter) { + DiagnoseUnsupportedPropertyUse(); + return ExprError(); + } if (SyntacticRefExpr) SyntacticRefExpr->setIsMessagingGetter(); @@ -675,10 +694,12 @@ ExprResult ObjCPropertyOpBuilder::buildGet() { assert(InstanceReceiver); receiverType = InstanceReceiver->getType(); } - + if (!Getter->isImplicit()) + S.DiagnoseUseOfDecl(Getter, GenericLoc, nullptr, true); // Build a message-send. ExprResult msg; - if (Getter->isInstanceMethod() || RefExpr->isObjectReceiver()) { + if ((Getter->isInstanceMethod() && !RefExpr->isClassReceiver()) || + RefExpr->isObjectReceiver()) { assert(InstanceReceiver || RefExpr->isSuperReceiver()); msg = S.BuildInstanceMessageImplicit(InstanceReceiver, receiverType, GenericLoc, Getter->getSelector(), @@ -697,8 +718,10 @@ ExprResult ObjCPropertyOpBuilder::buildGet() { /// value being set as the value of the property operation. ExprResult ObjCPropertyOpBuilder::buildSet(Expr *op, SourceLocation opcLoc, bool captureSetValueAsResult) { - bool hasSetter = findSetter(false); - assert(hasSetter); (void) hasSetter; + if (!findSetter(false)) { + DiagnoseUnsupportedPropertyUse(); + return ExprError(); + } if (SyntacticRefExpr) SyntacticRefExpr->setIsMessagingSetter(); @@ -727,7 +750,7 @@ ExprResult ObjCPropertyOpBuilder::buildSet(Expr *op, SourceLocation opcLoc, Sema::AA_Assigning)) return ExprError(); - op = opResult.take(); + op = opResult.get(); assert(op && "successful assignment left argument invalid?"); } else if (OpaqueValueExpr *OVE = dyn_cast<OpaqueValueExpr>(op)) { @@ -747,7 +770,10 @@ ExprResult ObjCPropertyOpBuilder::buildSet(Expr *op, SourceLocation opcLoc, // Build a message-send. ExprResult msg; - if (Setter->isInstanceMethod() || RefExpr->isObjectReceiver()) { + if (!Setter->isImplicit()) + S.DiagnoseUseOfDecl(Setter, GenericLoc, nullptr, true); + if ((Setter->isInstanceMethod() && !RefExpr->isClassReceiver()) || + RefExpr->isObjectReceiver()) { msg = S.BuildInstanceMessageImplicit(InstanceReceiver, receiverType, GenericLoc, SetterSelector, Setter, MultiExprArg(args, 1)); @@ -762,7 +788,7 @@ ExprResult ObjCPropertyOpBuilder::buildSet(Expr *op, SourceLocation opcLoc, ObjCMessageExpr *msgExpr = cast<ObjCMessageExpr>(msg.get()->IgnoreImplicit()); Expr *arg = msgExpr->getArg(0); - if (CanCaptureValueOfType(arg->getType())) + if (CanCaptureValue(arg)) msgExpr->setArg(0, captureValueAsResult(arg)); } @@ -788,13 +814,20 @@ ExprResult ObjCPropertyOpBuilder::buildRValueOperation(Expr *op) { // As a special case, if the method returns 'id', try to get // a better type from the property. - if (RefExpr->isExplicitProperty() && result.get()->isRValue() && - result.get()->getType()->isObjCIdType()) { + if (RefExpr->isExplicitProperty() && result.get()->isRValue()) { QualType propType = RefExpr->getExplicitProperty()->getType(); - if (const ObjCObjectPointerType *ptr - = propType->getAs<ObjCObjectPointerType>()) { - if (!ptr->isObjCIdType()) - result = S.ImpCastExprToType(result.get(), propType, CK_BitCast); + if (result.get()->getType()->isObjCIdType()) { + if (const ObjCObjectPointerType *ptr + = propType->getAs<ObjCObjectPointerType>()) { + if (!ptr->isObjCIdType()) + result = S.ImpCastExprToType(result.get(), propType, CK_BitCast); + } + } + if (S.getLangOpts().ObjCAutoRefCount) { + Qualifiers::ObjCLifetime LT = propType.getObjCLifetime(); + if (LT == Qualifiers::OCL_Weak) + if (!S.Diags.isIgnored(diag::warn_arc_repeated_use_of_weak, RefExpr->getLocation())) + S.getCurFunction()->markSafeWeakUse(RefExpr); } } @@ -810,10 +843,15 @@ bool ObjCPropertyOpBuilder::tryBuildGetOfReference(Expr *op, if (!S.getLangOpts().CPlusPlus) return false; findGetter(); - assert(Getter && "property has no setter and no getter!"); + if (!Getter) { + // The property has no setter and no getter! This can happen if the type is + // invalid. Error have already been reported. + result = ExprError(); + return true; + } // Only do this if the getter returns an l-value reference type. - QualType resultType = Getter->getResultType(); + QualType resultType = Getter->getReturnType(); if (!resultType->isLValueReferenceType()) return false; result = buildRValueOperation(op); @@ -834,7 +872,7 @@ ObjCPropertyOpBuilder::buildAssignmentOperation(Scope *Sc, ExprResult result; if (tryBuildGetOfReference(LHS, result)) { if (result.isInvalid()) return ExprError(); - return S.BuildBinOp(Sc, opcLoc, opcode, result.take(), RHS); + return S.BuildBinOp(Sc, opcLoc, opcode, result.get(), RHS); } // Otherwise, it's an error. @@ -878,7 +916,7 @@ ObjCPropertyOpBuilder::buildIncDecOperation(Scope *Sc, SourceLocation opcLoc, ExprResult result; if (tryBuildGetOfReference(op, result)) { if (result.isInvalid()) return ExprError(); - return S.BuildUnaryOp(Sc, opcLoc, opcode, result.take()); + return S.BuildUnaryOp(Sc, opcLoc, opcode, result.get()); } // Otherwise, it's an error. @@ -906,14 +944,11 @@ ObjCPropertyOpBuilder::buildIncDecOperation(Scope *Sc, SourceLocation opcLoc, } ExprResult ObjCPropertyOpBuilder::complete(Expr *SyntacticForm) { - if (S.getLangOpts().ObjCAutoRefCount && isWeakProperty()) { - DiagnosticsEngine::Level Level = - S.Diags.getDiagnosticLevel(diag::warn_arc_repeated_use_of_weak, - SyntacticForm->getLocStart()); - if (Level != DiagnosticsEngine::Ignored) + if (S.getLangOpts().ObjCAutoRefCount && isWeakProperty() && + !S.Diags.isIgnored(diag::warn_arc_repeated_use_of_weak, + SyntacticForm->getLocStart())) S.recordUseOfEvaluatedWeak(SyntacticRefExpr, SyntacticRefExpr->isMessagingGetter()); - } return PseudoOpBuilder::complete(SyntacticForm); } @@ -961,8 +996,8 @@ ObjCSubscriptOpBuilder::buildAssignmentOperation(Scope *Sc, /// Capture the base object of an Objective-C Index'ed expression. Expr *ObjCSubscriptOpBuilder::rebuildAndCaptureObject(Expr *syntacticBase) { - assert(InstanceBase == 0); - + assert(InstanceBase == nullptr); + // Capture base expression in an OVE and rebuild the syntactic // form to use the OVE as its base expression. InstanceBase = capture(RefExpr->getBaseExpr()); @@ -1011,8 +1046,6 @@ Sema::ObjCSubscriptKind // Look for a conversion to an integral, enumeration type, or // objective-C pointer type. - UnresolvedSet<4> ViableConversions; - UnresolvedSet<4> ExplicitConversions; std::pair<CXXRecordDecl::conversion_iterator, CXXRecordDecl::conversion_iterator> Conversions = cast<CXXRecordDecl>(RecordTy->getDecl())->getVisibleConversionFunctions(); @@ -1069,7 +1102,7 @@ static void CheckKeyForObjCARCConversion(Sema &S, QualType ContainerT, true /*instance*/); if (!Getter) return; - QualType T = Getter->param_begin()[0]->getType(); + QualType T = Getter->parameters()[0]->getType(); S.CheckObjCARCConversion(Key->getSourceRange(), T, Key, Sema::CCK_ImplicitConversion); } @@ -1130,7 +1163,7 @@ bool ObjCSubscriptOpBuilder::findAtIndexGetter() { AtIndexGetter = ObjCMethodDecl::Create(S.Context, SourceLocation(), SourceLocation(), AtIndexGetterSelector, S.Context.getObjCIdType() /*ReturnType*/, - 0 /*TypeSourceInfo */, + nullptr /*TypeSourceInfo */, S.Context.getTranslationUnitDecl(), true /*Instance*/, false/*isVariadic*/, /*isPropertyAccessor=*/false, @@ -1143,9 +1176,9 @@ bool ObjCSubscriptOpBuilder::findAtIndexGetter() { : &S.Context.Idents.get("key"), arrayRef ? S.Context.UnsignedLongTy : S.Context.getObjCIdType(), - /*TInfo=*/0, + /*TInfo=*/nullptr, SC_None, - 0); + nullptr); AtIndexGetter->setMethodParams(S.Context, Argument, None); } @@ -1162,17 +1195,17 @@ bool ObjCSubscriptOpBuilder::findAtIndexGetter() { } if (AtIndexGetter) { - QualType T = AtIndexGetter->param_begin()[0]->getType(); + QualType T = AtIndexGetter->parameters()[0]->getType(); if ((arrayRef && !T->isIntegralOrEnumerationType()) || (!arrayRef && !T->isObjCObjectPointerType())) { S.Diag(RefExpr->getKeyExpr()->getExprLoc(), arrayRef ? diag::err_objc_subscript_index_type : diag::err_objc_subscript_key_type) << T; - S.Diag(AtIndexGetter->param_begin()[0]->getLocation(), + S.Diag(AtIndexGetter->parameters()[0]->getLocation(), diag::note_parameter_type) << T; return false; } - QualType R = AtIndexGetter->getResultType(); + QualType R = AtIndexGetter->getReturnType(); if (!R->isObjCObjectPointerType()) { S.Diag(RefExpr->getKeyExpr()->getExprLoc(), diag::err_objc_indexing_method_result_type) << R << arrayRef; @@ -1239,26 +1272,23 @@ bool ObjCSubscriptOpBuilder::findAtIndexSetter() { BaseT->isObjCQualifiedIdType()); if (!AtIndexSetter && S.getLangOpts().DebuggerObjCLiteral) { - TypeSourceInfo *ResultTInfo = 0; + TypeSourceInfo *ReturnTInfo = nullptr; QualType ReturnType = S.Context.VoidTy; - AtIndexSetter = ObjCMethodDecl::Create(S.Context, SourceLocation(), - SourceLocation(), AtIndexSetterSelector, - ReturnType, - ResultTInfo, - S.Context.getTranslationUnitDecl(), - true /*Instance*/, false/*isVariadic*/, - /*isPropertyAccessor=*/false, - /*isImplicitlyDeclared=*/true, /*isDefined=*/false, - ObjCMethodDecl::Required, - false); + AtIndexSetter = ObjCMethodDecl::Create( + S.Context, SourceLocation(), SourceLocation(), AtIndexSetterSelector, + ReturnType, ReturnTInfo, S.Context.getTranslationUnitDecl(), + true /*Instance*/, false /*isVariadic*/, + /*isPropertyAccessor=*/false, + /*isImplicitlyDeclared=*/true, /*isDefined=*/false, + ObjCMethodDecl::Required, false); SmallVector<ParmVarDecl *, 2> Params; ParmVarDecl *object = ParmVarDecl::Create(S.Context, AtIndexSetter, SourceLocation(), SourceLocation(), &S.Context.Idents.get("object"), S.Context.getObjCIdType(), - /*TInfo=*/0, + /*TInfo=*/nullptr, SC_None, - 0); + nullptr); Params.push_back(object); ParmVarDecl *key = ParmVarDecl::Create(S.Context, AtIndexSetter, SourceLocation(), SourceLocation(), @@ -1266,9 +1296,9 @@ bool ObjCSubscriptOpBuilder::findAtIndexSetter() { : &S.Context.Idents.get("key"), arrayRef ? S.Context.UnsignedLongTy : S.Context.getObjCIdType(), - /*TInfo=*/0, + /*TInfo=*/nullptr, SC_None, - 0); + nullptr); Params.push_back(key); AtIndexSetter->setMethodParams(S.Context, Params, None); } @@ -1288,26 +1318,26 @@ bool ObjCSubscriptOpBuilder::findAtIndexSetter() { bool err = false; if (AtIndexSetter && arrayRef) { - QualType T = AtIndexSetter->param_begin()[1]->getType(); + QualType T = AtIndexSetter->parameters()[1]->getType(); if (!T->isIntegralOrEnumerationType()) { S.Diag(RefExpr->getKeyExpr()->getExprLoc(), diag::err_objc_subscript_index_type) << T; - S.Diag(AtIndexSetter->param_begin()[1]->getLocation(), + S.Diag(AtIndexSetter->parameters()[1]->getLocation(), diag::note_parameter_type) << T; err = true; } - T = AtIndexSetter->param_begin()[0]->getType(); + T = AtIndexSetter->parameters()[0]->getType(); if (!T->isObjCObjectPointerType()) { S.Diag(RefExpr->getBaseExpr()->getExprLoc(), diag::err_objc_subscript_object_type) << T << arrayRef; - S.Diag(AtIndexSetter->param_begin()[0]->getLocation(), + S.Diag(AtIndexSetter->parameters()[0]->getLocation(), diag::note_parameter_type) << T; err = true; } } else if (AtIndexSetter && !arrayRef) for (unsigned i=0; i <2; i++) { - QualType T = AtIndexSetter->param_begin()[i]->getType(); + QualType T = AtIndexSetter->parameters()[i]->getType(); if (!T->isObjCObjectPointerType()) { if (i == 1) S.Diag(RefExpr->getKeyExpr()->getExprLoc(), @@ -1315,7 +1345,7 @@ bool ObjCSubscriptOpBuilder::findAtIndexSetter() { else S.Diag(RefExpr->getBaseExpr()->getExprLoc(), diag::err_objc_subscript_dic_object_type) << T; - S.Diag(AtIndexSetter->param_begin()[i]->getLocation(), + S.Diag(AtIndexSetter->parameters()[i]->getLocation(), diag::note_parameter_type) << T; err = true; } @@ -1339,6 +1369,8 @@ ExprResult ObjCSubscriptOpBuilder::buildGet() { // Arguments. Expr *args[] = { Index }; assert(InstanceBase); + if (AtIndexGetter) + S.DiagnoseUseOfDecl(AtIndexGetter, GenericLoc); msg = S.BuildInstanceMessageImplicit(InstanceBase, receiverType, GenericLoc, AtIndexGetterSelector, AtIndexGetter, @@ -1355,7 +1387,8 @@ ExprResult ObjCSubscriptOpBuilder::buildSet(Expr *op, SourceLocation opcLoc, bool captureSetValueAsResult) { if (!findAtIndexSetter()) return ExprError(); - + if (AtIndexSetter) + S.DiagnoseUseOfDecl(AtIndexSetter, GenericLoc); QualType receiverType = InstanceBase->getType(); Expr *Index = InstanceKey; @@ -1373,7 +1406,7 @@ ExprResult ObjCSubscriptOpBuilder::buildSet(Expr *op, SourceLocation opcLoc, ObjCMessageExpr *msgExpr = cast<ObjCMessageExpr>(msg.get()->IgnoreImplicit()); Expr *arg = msgExpr->getArg(0); - if (CanCaptureValueOfType(arg->getType())) + if (CanCaptureValue(arg)) msgExpr->setArg(0, captureValueAsResult(arg)); } @@ -1395,8 +1428,8 @@ Expr *MSPropertyOpBuilder::rebuildAndCaptureObject(Expr *syntacticBase) { ExprResult MSPropertyOpBuilder::buildGet() { if (!RefExpr->getPropertyDecl()->hasGetter()) { - S.Diag(RefExpr->getMemberLoc(), diag::err_no_getter_for_property) - << RefExpr->getPropertyDecl()->getName(); + S.Diag(RefExpr->getMemberLoc(), diag::err_no_accessor_for_property) + << 0 /* getter */ << RefExpr->getPropertyDecl(); return ExprError(); } @@ -1408,15 +1441,16 @@ ExprResult MSPropertyOpBuilder::buildGet() { ExprResult GetterExpr = S.ActOnMemberAccessExpr( S.getCurScope(), RefExpr->getBaseExpr(), SourceLocation(), RefExpr->isArrow() ? tok::arrow : tok::period, SS, SourceLocation(), - GetterName, 0, true); + GetterName, nullptr, true); if (GetterExpr.isInvalid()) { - S.Diag(RefExpr->getMemberLoc(), diag::error_cannot_find_suitable_getter) - << RefExpr->getPropertyDecl()->getName(); + S.Diag(RefExpr->getMemberLoc(), + diag::error_cannot_find_suitable_accessor) << 0 /* getter */ + << RefExpr->getPropertyDecl(); return ExprError(); } MultiExprArg ArgExprs; - return S.ActOnCallExpr(S.getCurScope(), GetterExpr.take(), + return S.ActOnCallExpr(S.getCurScope(), GetterExpr.get(), RefExpr->getSourceRange().getBegin(), ArgExprs, RefExpr->getSourceRange().getEnd()); } @@ -1424,8 +1458,8 @@ ExprResult MSPropertyOpBuilder::buildGet() { ExprResult MSPropertyOpBuilder::buildSet(Expr *op, SourceLocation sl, bool captureSetValueAsResult) { if (!RefExpr->getPropertyDecl()->hasSetter()) { - S.Diag(RefExpr->getMemberLoc(), diag::err_no_setter_for_property) - << RefExpr->getPropertyDecl()->getName(); + S.Diag(RefExpr->getMemberLoc(), diag::err_no_accessor_for_property) + << 1 /* setter */ << RefExpr->getPropertyDecl(); return ExprError(); } @@ -1437,16 +1471,17 @@ ExprResult MSPropertyOpBuilder::buildSet(Expr *op, SourceLocation sl, ExprResult SetterExpr = S.ActOnMemberAccessExpr( S.getCurScope(), RefExpr->getBaseExpr(), SourceLocation(), RefExpr->isArrow() ? tok::arrow : tok::period, SS, SourceLocation(), - SetterName, 0, true); + SetterName, nullptr, true); if (SetterExpr.isInvalid()) { - S.Diag(RefExpr->getMemberLoc(), diag::error_cannot_find_suitable_setter) - << RefExpr->getPropertyDecl()->getName(); + S.Diag(RefExpr->getMemberLoc(), + diag::error_cannot_find_suitable_accessor) << 1 /* setter */ + << RefExpr->getPropertyDecl(); return ExprError(); } SmallVector<Expr*, 1> ArgExprs; ArgExprs.push_back(op); - return S.ActOnCallExpr(S.getCurScope(), SetterExpr.take(), + return S.ActOnCallExpr(S.getCurScope(), SetterExpr.get(), RefExpr->getSourceRange().getBegin(), ArgExprs, op->getSourceRange().getEnd()); } @@ -1513,7 +1548,7 @@ ExprResult Sema::checkPseudoObjectAssignment(Scope *S, SourceLocation opcLoc, if (RHS->getType()->isNonOverloadPlaceholderType()) { ExprResult result = CheckPlaceholderExpr(RHS); if (result.isInvalid()) return ExprError(); - RHS = result.take(); + RHS = result.get(); } Expr *opaqueRef = LHS->IgnoreParens(); |