48    unsigned MSPropertySubscriptCount;
 
   49    typedef llvm::function_ref<Expr *(Expr *, unsigned)> SpecificRebuilderRefTy;
 
   50    const SpecificRebuilderRefTy &SpecificCallback;
 
   51    Rebuilder(Sema &S, 
const SpecificRebuilderRefTy &SpecificCallback)
 
   52        : S(S), MSPropertySubscriptCount(0),
 
   53          SpecificCallback(SpecificCallback) {}
 
   55    Expr *rebuildObjCPropertyRefExpr(ObjCPropertyRefExpr *refExpr) {
 
   62        return new (S.Context) ObjCPropertyRefExpr(
 
   67      return new (S.Context) ObjCPropertyRefExpr(
 
   73    Expr *rebuildObjCSubscriptRefExpr(ObjCSubscriptRefExpr *refExpr) {
 
   77      return new (S.Context) ObjCSubscriptRefExpr(
 
   84    Expr *rebuildMSPropertyRefExpr(MSPropertyRefExpr *refExpr) {
 
   87      return new (S.Context) MSPropertyRefExpr(
 
   93    Expr *rebuildMSPropertySubscriptExpr(MSPropertySubscriptExpr *refExpr) {
 
   97      auto *NewBase = rebuild(refExpr->
getBase());
 
   98      ++MSPropertySubscriptCount;
 
   99      return new (S.Context) MSPropertySubscriptExpr(
 
  101          SpecificCallback(refExpr->
getIdx(), MSPropertySubscriptCount),
 
  106    Expr *rebuild(Expr *e) {
 
  108      if (
auto *PRE = dyn_cast<ObjCPropertyRefExpr>(e))
 
  109        return rebuildObjCPropertyRefExpr(PRE);
 
  110      if (
auto *SRE = dyn_cast<ObjCSubscriptRefExpr>(e))
 
  111        return rebuildObjCSubscriptRefExpr(SRE);
 
  112      if (
auto *MSPRE = dyn_cast<MSPropertyRefExpr>(e))
 
  113        return rebuildMSPropertyRefExpr(MSPRE);
 
  114      if (
auto *MSPSE = dyn_cast<MSPropertySubscriptExpr>(e))
 
  115        return rebuildMSPropertySubscriptExpr(MSPSE);
 
  120      if (ParenExpr *parens = dyn_cast<ParenExpr>(e)) {
 
  121        e = rebuild(parens->getSubExpr());
 
  122        return new (S.Context) ParenExpr(parens->getLParen(),
 
  127      if (UnaryOperator *uop = dyn_cast<UnaryOperator>(e)) {
 
  128        assert(uop->getOpcode() == UO_Extension);
 
  129        e = rebuild(uop->getSubExpr());
 
  131            S.Context, e, uop->getOpcode(), uop->getType(), uop->getValueKind(),
 
  132            uop->getObjectKind(), uop->getOperatorLoc(), uop->canOverflow(),
 
  133            S.CurFPFeatureOverrides());
 
  136      if (GenericSelectionExpr *gse = dyn_cast<GenericSelectionExpr>(e)) {
 
  137        assert(!gse->isResultDependent());
 
  138        unsigned resultIndex = gse->getResultIndex();
 
  139        unsigned numAssocs = gse->getNumAssocs();
 
  141        SmallVector<Expr *, 8> assocExprs;
 
  142        SmallVector<TypeSourceInfo *, 8> assocTypes;
 
  143        assocExprs.reserve(numAssocs);
 
  144        assocTypes.reserve(numAssocs);
 
  147             gse->associations()) {
 
  148          Expr *assocExpr = assoc.getAssociationExpr();
 
  149          if (assoc.isSelected())
 
  150            assocExpr = rebuild(assocExpr);
 
  151          assocExprs.push_back(assocExpr);
 
  152          assocTypes.push_back(assoc.getTypeSourceInfo());
 
  155        if (gse->isExprPredicate())
 
  157              S.Context, gse->getGenericLoc(), gse->getControllingExpr(),
 
  158              assocTypes, assocExprs, gse->getDefaultLoc(), gse->getRParenLoc(),
 
  159              gse->containsUnexpandedParameterPack(), resultIndex);
 
  161            S.Context, gse->getGenericLoc(), gse->getControllingType(),
 
  162            assocTypes, assocExprs, gse->getDefaultLoc(), gse->getRParenLoc(),
 
  163            gse->containsUnexpandedParameterPack(), resultIndex);
 
  166      if (ChooseExpr *ce = dyn_cast<ChooseExpr>(e)) {
 
  167        assert(!ce->isConditionDependent());
 
  169        Expr *LHS = ce->getLHS(), *RHS = ce->getRHS();
 
  170        Expr *&rebuiltExpr = ce->isConditionTrue() ? LHS : RHS;
 
  171        rebuiltExpr = rebuild(rebuiltExpr);
 
  173        return new (S.Context)
 
  174            ChooseExpr(ce->getBuiltinLoc(), ce->getCond(), LHS, RHS,
 
  177                       ce->isConditionTrue());
 
  180      llvm_unreachable(
"bad expression to rebuild!");
 
  184  class PseudoOpBuilder {
 
  187    unsigned ResultIndex;
 
  188    SourceLocation GenericLoc;
 
  190    SmallVector<Expr *, 4> Semantics;
 
  192    PseudoOpBuilder(Sema &S, SourceLocation genericLoc, 
bool IsUnique)
 
  193      : S(S), ResultIndex(PseudoObjectExpr::NoResult),
 
  194        GenericLoc(genericLoc), IsUnique(IsUnique) {}
 
  196    virtual ~PseudoOpBuilder() {}
 
  199    void addSemanticExpr(Expr *semantic) {
 
  200      Semantics.push_back(semantic);
 
  204    void addResultSemanticExpr(Expr *resultExpr) {
 
  206      ResultIndex = Semantics.size();
 
  207      Semantics.push_back(resultExpr);
 
  209      if (
auto *OVE = dyn_cast<OpaqueValueExpr>(Semantics.back()))
 
  210        OVE->setIsUnique(
false);
 
  214    ExprResult buildAssignmentOperation(Scope *Sc,
 
  215                                        SourceLocation opLoc,
 
  217                                        Expr *LHS, Expr *RHS);
 
  218    ExprResult buildIncDecOperation(Scope *Sc, SourceLocation opLoc,
 
  222    virtual ExprResult complete(Expr *syntacticForm);
 
  224    OpaqueValueExpr *capture(Expr *op);
 
  225    OpaqueValueExpr *captureValueAsResult(Expr *op);
 
  227    void setResultToLastSemantic() {
 
  229      ResultIndex = Semantics.size() - 1;
 
  231      if (
auto *OVE = dyn_cast<OpaqueValueExpr>(Semantics.back()))
 
  232        OVE->setIsUnique(
false);
 
  236    static bool CanCaptureValue(Expr *
exp) {
 
  237      if (
exp->isGLValue())
 
  239      QualType ty = 
exp->getType();
 
  244        return ClassDecl->isTriviallyCopyable();
 
  248    virtual Expr *rebuildAndCaptureObject(Expr *) = 0;
 
  250    virtual ExprResult buildSet(Expr *, SourceLocation,
 
  251                                bool captureSetValueAsResult) = 0;
 
  265    virtual bool captureSetValueAsResult()
 const { 
return true; }
 
  269  class ObjCPropertyOpBuilder : 
public PseudoOpBuilder {
 
  270    ObjCPropertyRefExpr *RefExpr;
 
  271    ObjCPropertyRefExpr *SyntacticRefExpr;
 
  272    OpaqueValueExpr *InstanceReceiver;
 
  273    ObjCMethodDecl *Getter;
 
  275    ObjCMethodDecl *Setter;
 
  276    Selector SetterSelector;
 
  277    Selector GetterSelector;
 
  280    ObjCPropertyOpBuilder(Sema &S, ObjCPropertyRefExpr *refExpr, 
bool IsUnique)
 
  281        : PseudoOpBuilder(S, refExpr->getLocation(), IsUnique),
 
  282          RefExpr(refExpr), SyntacticRefExpr(
nullptr),
 
  287    ExprResult buildAssignmentOperation(Scope *Sc,
 
  288                                        SourceLocation opLoc,
 
  290                                        Expr *LHS, Expr *RHS);
 
  291    ExprResult buildIncDecOperation(Scope *Sc, SourceLocation opLoc,
 
  295    bool tryBuildGetOfReference(Expr *op, 
ExprResult &result);
 
  296    bool findSetter(
bool warn=
true);
 
  298    void DiagnoseUnsupportedPropertyUse();
 
  300    Expr *rebuildAndCaptureObject(Expr *syntacticBase) 
override;
 
  302    ExprResult buildSet(Expr *op, SourceLocation, 
bool) 
override;
 
  303    ExprResult complete(Expr *SyntacticForm) 
override;
 
  305    bool isWeakProperty() 
const;
 
  309 class ObjCSubscriptOpBuilder : 
public PseudoOpBuilder {
 
  310   ObjCSubscriptRefExpr *RefExpr;
 
  311   OpaqueValueExpr *InstanceBase;
 
  312   OpaqueValueExpr *InstanceKey;
 
  313   ObjCMethodDecl *AtIndexGetter;
 
  314   Selector AtIndexGetterSelector;
 
  316   ObjCMethodDecl *AtIndexSetter;
 
  317   Selector AtIndexSetterSelector;
 
  320   ObjCSubscriptOpBuilder(Sema &S, ObjCSubscriptRefExpr *refExpr, 
bool IsUnique)
 
  321       : PseudoOpBuilder(S, refExpr->
getSourceRange().getBegin(), IsUnique),
 
  326   ExprResult buildAssignmentOperation(Scope *Sc,
 
  327                                       SourceLocation opLoc,
 
  329                                       Expr *LHS, Expr *RHS);
 
  330   Expr *rebuildAndCaptureObject(Expr *syntacticBase) 
override;
 
  332   bool findAtIndexGetter();
 
  333   bool findAtIndexSetter();
 
  336   ExprResult buildSet(Expr *op, SourceLocation, 
bool) 
override;
 
  339 class MSPropertyOpBuilder : 
public PseudoOpBuilder {
 
  340   MSPropertyRefExpr *RefExpr;
 
  341   OpaqueValueExpr *InstanceBase;
 
  342   SmallVector<Expr *, 4> CallArgs;
 
  344   MSPropertyRefExpr *getBaseMSProperty(MSPropertySubscriptExpr *E);
 
  347   MSPropertyOpBuilder(Sema &S, MSPropertyRefExpr *refExpr, 
bool IsUnique)
 
  348       : PseudoOpBuilder(S, refExpr->
getSourceRange().getBegin(), IsUnique),
 
  349         RefExpr(refExpr), InstanceBase(
nullptr) {}
 
  350   MSPropertyOpBuilder(Sema &S, MSPropertySubscriptExpr *refExpr, 
bool IsUnique)
 
  351       : PseudoOpBuilder(S, refExpr->
getSourceRange().getBegin(), IsUnique),
 
  353     RefExpr = getBaseMSProperty(refExpr);
 
  356   Expr *rebuildAndCaptureObject(Expr *) 
override;
 
  358   ExprResult buildSet(Expr *op, SourceLocation, 
bool) 
override;
 
  359   bool captureSetValueAsResult()
 const override { 
return false; }
 
  366  OpaqueValueExpr *captured =
 
  374  addSemanticExpr(captured);
 
  384OpaqueValueExpr *PseudoOpBuilder::captureValueAsResult(Expr *e) {
 
  390    OpaqueValueExpr *cap = capture(e);
 
  391    setResultToLastSemantic();
 
  399    assert(index < Semantics.size() &&
 
  400           "captured expression not found in semantics!");
 
  401    if (e == Semantics[index]) 
break;
 
  410ExprResult PseudoOpBuilder::complete(Expr *syntactic) {
 
  412                                  Semantics, ResultIndex);
 
  416ExprResult PseudoOpBuilder::buildRValueOperation(Expr *op) {
 
  417  Expr *syntacticBase = rebuildAndCaptureObject(op);
 
  421  addResultSemanticExpr(
getExpr.get());
 
  423  return complete(syntacticBase);
 
  429PseudoOpBuilder::buildAssignmentOperation(Scope *Sc, SourceLocation opcLoc,
 
  431                                          Expr *LHS, Expr *RHS) {
 
  434  Expr *syntacticLHS = rebuildAndCaptureObject(LHS);
 
  435  OpaqueValueExpr *capturedRHS = capture(RHS);
 
  443  Expr *semanticRHS = capturedRHS;
 
  446    Semantics.pop_back();
 
  452  if (opcode == BO_Assign) {
 
  453    result = semanticRHS;
 
  455                                       opcode, capturedRHS->
getType(),
 
  466    result = S.
BuildBinOp(Sc, opcLoc, nonCompound, opLHS.
get(), semanticRHS);
 
  478  result = buildSet(result.
get(), opcLoc, captureSetValueAsResult());
 
  480  addSemanticExpr(result.
get());
 
  483    setResultToLastSemantic();
 
  485  return complete(syntactic);
 
  491PseudoOpBuilder::buildIncDecOperation(Scope *Sc, SourceLocation opcLoc,
 
  496  Expr *syntacticOp = rebuildAndCaptureObject(op);
 
  502  QualType resultType = result.
get()->
getType();
 
  507    result = capture(result.
get());
 
  508    setResultToLastSemantic();
 
  517    result = S.
BuildBinOp(Sc, opcLoc, BO_Add, result.
get(), one);
 
  519    result = S.
BuildBinOp(Sc, opcLoc, BO_Sub, result.
get(), one);
 
  526                                              captureSetValueAsResult());
 
  528  addSemanticExpr(result.
get());
 
  532    setResultToLastSemantic();
 
  534  UnaryOperator *syntactic =
 
  542  return complete(syntactic);
 
  587bool ObjCPropertyOpBuilder::isWeakProperty()
 const {
 
  604bool ObjCPropertyOpBuilder::findGetter() {
 
  605  if (Getter) 
return true;
 
  616      assert(setter && 
"both setter and getter are null - cannot happen");
 
  617      const IdentifierInfo *setterName =
 
  619      const IdentifierInfo *getterName =
 
  629  return (Getter != 
nullptr);
 
  636bool ObjCPropertyOpBuilder::findSetter(
bool warn) {
 
  660  if (ObjCMethodDecl *setter =
 
  663      if (
const ObjCInterfaceDecl *IFace =
 
  665        StringRef thisPropertyName = prop->
getName();
 
  667        char front = thisPropertyName.front();
 
  669        SmallString<100> PropertyName = thisPropertyName;
 
  670        PropertyName[0] = front;
 
  671        const IdentifierInfo *AltMember =
 
  673        if (ObjCPropertyDecl *prop1 = IFace->FindPropertyDeclaration(
 
  675          if (prop != prop1 && (prop1->getSetterMethodDecl() == setter)) {
 
  676            S.Diag(RefExpr->getExprLoc(), diag::err_property_setter_ambiguous_use)
 
  677              << prop << prop1 << setter->getSelector();
 
  678            S.Diag(prop->getLocation(), diag::note_property_declare);
 
  679            S.Diag(prop1->getLocation(), diag::note_property_declare);
 
  694void ObjCPropertyOpBuilder::DiagnoseUnsupportedPropertyUse() {
 
  700               diag::err_property_function_in_objc_container);
 
  707Expr *ObjCPropertyOpBuilder::rebuildAndCaptureObject(Expr *syntacticBase) {
 
  708  assert(InstanceReceiver == 
nullptr);
 
  713    InstanceReceiver = capture(RefExpr->
getBase());
 
  714    syntacticBase = Rebuilder(S, [=](Expr *, 
unsigned) -> Expr * {
 
  715                      return InstanceReceiver;
 
  716                    }).rebuild(syntacticBase);
 
  719  if (ObjCPropertyRefExpr *
 
  720        refE = dyn_cast<ObjCPropertyRefExpr>(syntacticBase->
IgnoreParens()))
 
  721    SyntacticRefExpr = refE;
 
  723  return syntacticBase;
 
  730    DiagnoseUnsupportedPropertyUse();
 
  734  if (SyntacticRefExpr)
 
  746        InstanceReceiver, receiverType, GenericLoc, Getter->
getSelector(),
 
  760ExprResult ObjCPropertyOpBuilder::buildSet(Expr *op, SourceLocation opcLoc,
 
  761                                           bool captureSetValueAsResult) {
 
  762  if (!findSetter(
false)) {
 
  763    DiagnoseUnsupportedPropertyUse();
 
  767  if (SyntacticRefExpr)
 
  776    QualType paramType = (*Setter->
param_begin())->getType()
 
  777                           .substObjCMemberType(
 
  780                             ObjCSubstitutionContext::Parameter);
 
  788                                     AssignmentAction::Assigning))
 
  792      assert(op && 
"successful assignment left argument invalid?");
 
  797  Expr *args[] = { op };
 
  806                                                GenericLoc, SetterSelector,
 
  814  if (!msg.
isInvalid() && captureSetValueAsResult) {
 
  815    ObjCMessageExpr *msgExpr =
 
  818    if (CanCaptureValue(arg))
 
  819      msgExpr->
setArg(0, captureValueAsResult(arg));
 
  826ExprResult ObjCPropertyOpBuilder::buildRValueOperation(Expr *op) {
 
  835  ExprResult result = PseudoOpBuilder::buildRValueOperation(op);
 
  849      if (
const ObjCObjectPointerType *ptr
 
  850            = propType->
getAs<ObjCObjectPointerType>()) {
 
  851        if (!ptr->isObjCIdType())
 
  868bool ObjCPropertyOpBuilder::tryBuildGetOfReference(Expr *op,
 
  884  result = buildRValueOperation(op);
 
  890ObjCPropertyOpBuilder::buildAssignmentOperation(Scope *Sc,
 
  891                                                SourceLocation opcLoc,
 
  893                                                Expr *LHS, Expr *RHS) {
 
  900    if (tryBuildGetOfReference(LHS, result)) {
 
  906    S.
Diag(opcLoc, diag::err_nosetter_property_assignment)
 
  916  if (opcode != BO_Assign && !findGetter()) {
 
  917    S.
Diag(opcLoc, diag::err_nogetter_property_compound_assignment)
 
  923    PseudoOpBuilder::buildAssignmentOperation(Sc, opcLoc, opcode, LHS, RHS);
 
  927  if (S.
getLangOpts().ObjCAutoRefCount && InstanceReceiver) {
 
  937ObjCPropertyOpBuilder::buildIncDecOperation(Scope *Sc, SourceLocation opcLoc,
 
  944    if (tryBuildGetOfReference(op, result)) {
 
  950    S.
Diag(opcLoc, diag::err_nosetter_property_incdec)
 
  963    S.
Diag(opcLoc, diag::err_nogetter_property_incdec)
 
  970  return PseudoOpBuilder::buildIncDecOperation(Sc, opcLoc, opcode, op);
 
  973ExprResult ObjCPropertyOpBuilder::complete(Expr *SyntacticForm) {
 
  980  return PseudoOpBuilder::complete(SyntacticForm);
 
  990ExprResult ObjCSubscriptOpBuilder::buildRValueOperation(Expr *op) {
 
  991  ExprResult result = PseudoOpBuilder::buildRValueOperation(op);
 
  998ObjCSubscriptOpBuilder::buildAssignmentOperation(Scope *Sc,
 
  999                                                SourceLocation opcLoc,
 
 1001                                                Expr *LHS, Expr *RHS) {
 
 1004  if (!findAtIndexSetter())
 
 1008  if (opcode != BO_Assign && !findAtIndexGetter())
 
 1012  PseudoOpBuilder::buildAssignmentOperation(Sc, opcLoc, opcode, LHS, RHS);
 
 1016  if (S.
getLangOpts().ObjCAutoRefCount && InstanceBase) {
 
 1025Expr *ObjCSubscriptOpBuilder::rebuildAndCaptureObject(Expr *syntacticBase) {
 
 1026  assert(InstanceBase == 
nullptr);
 
 1031  InstanceKey = capture(RefExpr->
getKeyExpr());
 
 1034      Rebuilder(S, [=](Expr *, 
unsigned Idx) -> Expr * {
 
 1037          return InstanceBase;
 
 1041          llvm_unreachable(
"Unexpected index for ObjCSubscriptExpr");
 
 1043      }).rebuild(syntacticBase);
 
 1045  return syntacticBase;
 
 1060      GetterSelector, ContainerT, 
true );
 
 
 1068bool ObjCSubscriptOpBuilder::findAtIndexGetter() {
 
 1073  QualType BaseT = BaseExpr->
getType();
 
 1075  QualType ResultType;
 
 1076  if (
const ObjCObjectPointerType *PTy =
 
 1077      BaseT->
getAs<ObjCObjectPointerType>()) {
 
 1090  if (ResultType.
isNull()) {
 
 1091    S.
Diag(BaseExpr->
getExprLoc(), diag::err_objc_subscript_base_type)
 
 1092      << BaseExpr->
getType() << arrayRef;
 
 1098    const IdentifierInfo *KeyIdents[] = {
 
 1104    const IdentifierInfo *KeyIdents[] = {
 
 1111      AtIndexGetterSelector, ResultType, 
true );
 
 1113  if (!AtIndexGetter && S.
getLangOpts().DebuggerObjCLiteral) {
 
 1115        S.
Context, SourceLocation(), SourceLocation(), AtIndexGetterSelector,
 
 1122        ObjCImplementationControl::Required, 
false);
 
 1124                                                SourceLocation(), SourceLocation(),
 
 1135  if (!AtIndexGetter) {
 
 1137      S.
Diag(BaseExpr->
getExprLoc(), diag::err_objc_subscript_method_not_found)
 
 1138      << BaseExpr->
getType() << 0 << arrayRef;
 
 1145  if (AtIndexGetter) {
 
 1146    QualType 
T = AtIndexGetter->
parameters()[0]->getType();
 
 1150             arrayRef ? diag::err_objc_subscript_index_type
 
 1151                      : diag::err_objc_subscript_key_type) << 
T;
 
 1153             diag::note_parameter_type) << 
T;
 
 1159             diag::err_objc_indexing_method_result_type) << R << arrayRef;
 
 1160      S.
Diag(AtIndexGetter->
getLocation(), diag::note_method_declared_at) <<
 
 1167bool ObjCSubscriptOpBuilder::findAtIndexSetter() {
 
 1172  QualType BaseT = BaseExpr->
getType();
 
 1174  QualType ResultType;
 
 1175  if (
const ObjCObjectPointerType *PTy =
 
 1176      BaseT->
getAs<ObjCObjectPointerType>()) {
 
 1190  if (ResultType.
isNull()) {
 
 1191    S.
Diag(BaseExpr->
getExprLoc(), diag::err_objc_subscript_base_type)
 
 1192      << BaseExpr->
getType() << arrayRef;
 
 1199    const IdentifierInfo *KeyIdents[] = {
 
 1206    const IdentifierInfo *KeyIdents[] = {
 
 1212      AtIndexSetterSelector, ResultType, 
true );
 
 1214  if (!AtIndexSetter && S.
getLangOpts().DebuggerObjCLiteral) {
 
 1215    TypeSourceInfo *ReturnTInfo = 
nullptr;
 
 1218        S.
Context, SourceLocation(), SourceLocation(), AtIndexSetterSelector,
 
 1224        ObjCImplementationControl::Required, 
false);
 
 1225    SmallVector<ParmVarDecl *, 2> Params;
 
 1227                                                SourceLocation(), SourceLocation(),
 
 1233    Params.push_back(
object);
 
 1235                                                SourceLocation(), SourceLocation(),
 
 1243    Params.push_back(key);
 
 1247  if (!AtIndexSetter) {
 
 1250             diag::err_objc_subscript_method_not_found)
 
 1251      << BaseExpr->
getType() << 1 << arrayRef;
 
 1259  if (AtIndexSetter && arrayRef) {
 
 1260    QualType 
T = AtIndexSetter->
parameters()[1]->getType();
 
 1263             diag::err_objc_subscript_index_type) << 
T;
 
 1265             diag::note_parameter_type) << 
T;
 
 1271             diag::err_objc_subscript_object_type) << 
T << arrayRef;
 
 1273             diag::note_parameter_type) << 
T;
 
 1277  else if (AtIndexSetter && !arrayRef)
 
 1278    for (
unsigned i=0; i <2; i++) {
 
 1279      QualType 
T = AtIndexSetter->
parameters()[i]->getType();
 
 1283                 diag::err_objc_subscript_key_type) << 
T;
 
 1286                 diag::err_objc_subscript_dic_object_type) << 
T;
 
 1288               diag::note_parameter_type) << 
T;
 
 1298ExprResult ObjCSubscriptOpBuilder::buildGet() {
 
 1299  if (!findAtIndexGetter())
 
 1302  QualType receiverType = InstanceBase->
getType();
 
 1306  Expr *Index = InstanceKey;
 
 1309  Expr *args[] = { Index };
 
 1310  assert(InstanceBase);
 
 1314      InstanceBase, receiverType, GenericLoc, AtIndexGetterSelector,
 
 1324ExprResult ObjCSubscriptOpBuilder::buildSet(Expr *op, SourceLocation opcLoc,
 
 1325                                           bool captureSetValueAsResult) {
 
 1326  if (!findAtIndexSetter())
 
 1330  QualType receiverType = InstanceBase->
getType();
 
 1331  Expr *Index = InstanceKey;
 
 1334  Expr *args[] = { op, Index };
 
 1338      InstanceBase, receiverType, GenericLoc, AtIndexSetterSelector,
 
 1341  if (!msg.
isInvalid() && captureSetValueAsResult) {
 
 1342    ObjCMessageExpr *msgExpr =
 
 1345    if (CanCaptureValue(arg))
 
 1346      msgExpr->
setArg(0, captureValueAsResult(arg));
 
 1357MSPropertyOpBuilder::getBaseMSProperty(MSPropertySubscriptExpr *E) {
 
 1358  CallArgs.insert(CallArgs.begin(), E->
getIdx());
 
 1360  while (
auto *MSPropSubscript = dyn_cast<MSPropertySubscriptExpr>(Base)) {
 
 1361    CallArgs.insert(CallArgs.begin(), MSPropSubscript->getIdx());
 
 1362    Base = MSPropSubscript->getBase()->IgnoreParens();
 
 1367Expr *MSPropertyOpBuilder::rebuildAndCaptureObject(Expr *syntacticBase) {
 
 1369  for (Expr *&Arg : CallArgs)
 
 1371  syntacticBase = Rebuilder(S, [=](Expr *, 
unsigned Idx) -> Expr * {
 
 1374                      return InstanceBase;
 
 1376                      assert(Idx <= CallArgs.size());
 
 1377                      return CallArgs[Idx - 1];
 
 1379                  }).rebuild(syntacticBase);
 
 1381  return syntacticBase;
 
 1398                              RefExpr->
isArrow() ? tok::arrow : tok::period, SS,
 
 1399                              SourceLocation(), GetterName, 
nullptr);
 
 1402           diag::err_cannot_find_suitable_accessor) << 0 
 
 1412ExprResult MSPropertyOpBuilder::buildSet(Expr *op, SourceLocation sl,
 
 1413                                         bool captureSetValueAsResult) {
 
 1427                              RefExpr->
isArrow() ? tok::arrow : tok::period, SS,
 
 1428                              SourceLocation(), SetterName, 
nullptr);
 
 1431           diag::err_cannot_find_suitable_accessor) << 1 
 
 1436  SmallVector<Expr*, 4> ArgExprs;
 
 1437  ArgExprs.append(CallArgs.begin(), CallArgs.end());
 
 1438  ArgExprs.push_back(op);
 
 1451        = dyn_cast<ObjCPropertyRefExpr>(opaqueRef)) {
 
 1452    ObjCPropertyOpBuilder builder(
SemaRef, refExpr, 
true);
 
 1453    return builder.buildRValueOperation(E);
 
 1456           = dyn_cast<ObjCSubscriptRefExpr>(opaqueRef)) {
 
 1457    ObjCSubscriptOpBuilder builder(
SemaRef, refExpr, 
true);
 
 1458    return builder.buildRValueOperation(E);
 
 1460             = dyn_cast<MSPropertyRefExpr>(opaqueRef)) {
 
 1461    MSPropertyOpBuilder builder(
SemaRef, refExpr, 
true);
 
 1462    return builder.buildRValueOperation(E);
 
 1464                 dyn_cast<MSPropertySubscriptExpr>(opaqueRef)) {
 
 1465    MSPropertyOpBuilder Builder(
SemaRef, RefExpr, 
true);
 
 1466    return Builder.buildRValueOperation(E);
 
 1468    llvm_unreachable(
"unknown pseudo-object kind!");
 
 
 1484        = dyn_cast<ObjCPropertyRefExpr>(opaqueRef)) {
 
 1485    ObjCPropertyOpBuilder builder(
SemaRef, refExpr, 
false);
 
 1486    return builder.buildIncDecOperation(Sc, opcLoc, opcode, op);
 
 1488    Diag(opcLoc, diag::err_illegal_container_subscripting_op);
 
 1491             = dyn_cast<MSPropertyRefExpr>(opaqueRef)) {
 
 1492    MSPropertyOpBuilder builder(
SemaRef, refExpr, 
false);
 
 1493    return builder.buildIncDecOperation(Sc, opcLoc, opcode, op);
 
 1495             = dyn_cast<MSPropertySubscriptExpr>(opaqueRef)) {
 
 1496    MSPropertyOpBuilder Builder(
SemaRef, RefExpr, 
false);
 
 1497    return Builder.buildIncDecOperation(Sc, opcLoc, opcode, op);
 
 1499    llvm_unreachable(
"unknown pseudo-object kind!");
 
 
 1519  bool IsSimpleAssign = opcode == BO_Assign;
 
 1522        = dyn_cast<ObjCPropertyRefExpr>(opaqueRef)) {
 
 1523    ObjCPropertyOpBuilder builder(
SemaRef, refExpr, IsSimpleAssign);
 
 1524    return builder.buildAssignmentOperation(S, opcLoc, opcode, LHS, RHS);
 
 1526             = dyn_cast<ObjCSubscriptRefExpr>(opaqueRef)) {
 
 1527    ObjCSubscriptOpBuilder builder(
SemaRef, refExpr, IsSimpleAssign);
 
 1528    return builder.buildAssignmentOperation(S, opcLoc, opcode, LHS, RHS);
 
 1530             = dyn_cast<MSPropertyRefExpr>(opaqueRef)) {
 
 1531    MSPropertyOpBuilder builder(
SemaRef, refExpr, IsSimpleAssign);
 
 1532    return builder.buildAssignmentOperation(S, opcLoc, opcode, LHS, RHS);
 
 1534             = dyn_cast<MSPropertySubscriptExpr>(opaqueRef)) {
 
 1535    MSPropertyOpBuilder Builder(
SemaRef, RefExpr, IsSimpleAssign);
 
 1536    return Builder.buildAssignmentOperation(S, opcLoc, opcode, LHS, RHS);
 
 1538    llvm_unreachable(
"unknown pseudo-object kind!");
 
 
 1565        uop->getValueKind(), uop->getObjectKind(), uop->getOperatorLoc(),
 
 1566        uop->canOverflow(), 
SemaRef.CurFPFeatureOverrides());
 
 1568               = dyn_cast<CompoundAssignOperator>(
syntax)) {
 
 1573        cop->getValueKind(), cop->getObjectKind(), cop->getOperatorLoc(),
 
 1574        SemaRef.CurFPFeatureOverrides(), cop->getComputationLHSType(),
 
 1575        cop->getComputationResultType());
 
 1581                                  bop->
getType(), bop->getValueKind(),
 
 1582                                  bop->getObjectKind(), bop->getOperatorLoc(),
 
 1583                                  SemaRef.CurFPFeatureOverrides());
 
 1588    assert(
syntax->hasPlaceholderType(BuiltinType::PseudoObject));
 
 
Defines the clang::Expr interface and subclasses for C++ expressions.
static DiagnosticBuilder Diag(DiagnosticsEngine *Diags, const LangOptions &Features, FullSourceLoc TokLoc, const char *TokBegin, const char *TokRangeBegin, const char *TokRangeEnd, unsigned DiagID)
Produce a diagnostic highlighting some portion of a literal.
Defines the clang::Preprocessor interface.
This file declares semantic analysis for Objective-C.
static ObjCMethodDecl * LookupMethodInReceiverType(Sema &S, Selector sel, const ObjCPropertyRefExpr *PRE)
Look up a method in the receiver type of an Objective-C property reference.
static Expr * stripOpaqueValuesFromPseudoObjectRef(Sema &S, Expr *E)
Given a pseudo-object reference, rebuild it without the opaque values.
static void CheckKeyForObjCARCConversion(Sema &S, QualType ContainerT, Expr *Key)
CheckKeyForObjCARCConversion - This routine suggests bridge casting of CF objects used as dictionary ...
This file declares semantic analysis for expressions involving.
Expr * getExpr()
Get 'expr' part of the associated expression/statement.
TranslationUnitDecl * getTranslationUnitDecl() const
QualType getObjCInterfaceType(const ObjCInterfaceDecl *Decl, ObjCInterfaceDecl *PrevDecl=nullptr) const
getObjCInterfaceType - Return the unique reference to the type for the specified ObjC interface decl.
SelectorTable & Selectors
CanQualType UnsignedLongTy
QualType getObjCIdType() const
Represents the Objective-CC id type.
uint64_t getTypeSize(QualType T) const
Return the size of the specified (complete) type T, in bits.
A builtin binary operation expression such as "x + y" or "x <= y".
static Opcode getOpForCompoundAssignment(Opcode Opc)
static BinaryOperator * Create(const ASTContext &C, Expr *lhs, Expr *rhs, Opcode opc, QualType ResTy, ExprValueKind VK, ExprObjectKind OK, SourceLocation opLoc, FPOptionsOverride FPFeatures)
bool isAssignmentOp() const
void Adopt(NestedNameSpecifierLoc Other)
Adopt an existing nested-name-specifier (with source-range information).
CompoundAssignOperator - For compound assignments (e.g.
static CompoundAssignOperator * Create(const ASTContext &C, Expr *lhs, Expr *rhs, Opcode opc, QualType ResTy, ExprValueKind VK, ExprObjectKind OK, SourceLocation opLoc, FPOptionsOverride FPFeatures, QualType CompLHSType=QualType(), QualType CompResultType=QualType())
Decl * getNonClosureAncestor()
Find the nearest non-closure ancestor of this context, i.e.
bool isObjCContainer() const
Decl::Kind getDeclKind() const
bool isImplicit() const
isImplicit - Indicates whether the declaration was implicitly generated by the implementation.
SourceLocation getLocation() const
DeclContext * getDeclContext()
bool isIgnored(unsigned DiagID, SourceLocation Loc) const
Determine whether the diagnostic is known to be ignored.
This represents one expression.
ExprValueKind getValueKind() const
getValueKind - The value kind that this expression produces.
bool isTypeDependent() const
Determines whether the type of this expression depends on.
Expr * IgnoreImplicit() LLVM_READONLY
Skip past any implicit AST nodes which might surround this expression until reaching a fixed point.
Expr * IgnoreParens() LLVM_READONLY
Skip past any parentheses which might surround this expression until reaching a fixed point.
ExprObjectKind getObjectKind() const
getObjectKind - The object kind that this expression produces.
SourceLocation getExprLoc() const LLVM_READONLY
getExprLoc - Return the preferred location for the arrow when diagnosing a problem with a generic exp...
bool hasPlaceholderType() const
Returns whether this expression has a placeholder type.
AssociationTy< false > Association
static GenericSelectionExpr * Create(const ASTContext &Context, SourceLocation GenericLoc, Expr *ControllingExpr, ArrayRef< TypeSourceInfo * > AssocTypes, ArrayRef< Expr * > AssocExprs, SourceLocation DefaultLoc, SourceLocation RParenLoc, bool ContainsUnexpandedParameterPack, unsigned ResultIndex)
Create a non-result-dependent generic selection expression accepting an expression predicate.
One of these records is kept for each identifier that is lexed.
StringRef getName() const
Return the actual identifier string.
IdentifierInfo & get(StringRef Name)
Return the identifier token info for the specified named identifier.
static IntegerLiteral * Create(const ASTContext &C, const llvm::APInt &V, QualType type, SourceLocation l)
Returns a new integer literal with value 'V' and type 'type'.
IdentifierInfo * getGetterId() const
IdentifierInfo * getSetterId() const
A member reference to an MSPropertyDecl.
NestedNameSpecifierLoc getQualifierLoc() const
SourceRange getSourceRange() const LLVM_READONLY
MSPropertyDecl * getPropertyDecl() const
Expr * getBaseExpr() const
SourceLocation getMemberLoc() const
MS property subscript expression.
SourceLocation getRBracketLoc() const
StringRef getName() const
Get the name of identifier for this declaration as a StringRef.
DeclarationName getDeclName() const
Get the actual, stored name of the declaration, which may be a special name.
Expr * getArg(unsigned Arg)
getArg - Return the specified argument.
void setArg(unsigned Arg, Expr *ArgExpr)
setArg - Set the specified argument.
ObjCMethodDecl - Represents an instance or class method declaration.
ArrayRef< ParmVarDecl * > parameters() const
bool isPropertyAccessor() const
static ObjCMethodDecl * Create(ASTContext &C, SourceLocation beginLoc, SourceLocation endLoc, Selector SelInfo, QualType T, TypeSourceInfo *ReturnTInfo, DeclContext *contextDecl, bool isInstance=true, bool isVariadic=false, bool isPropertyAccessor=false, bool isSynthesizedAccessorStub=false, bool isImplicitlyDeclared=false, bool isDefined=false, ObjCImplementationControl impControl=ObjCImplementationControl::None, bool HasRelatedResultType=false)
param_const_iterator param_begin() const
void setMethodParams(ASTContext &C, ArrayRef< ParmVarDecl * > Params, ArrayRef< SourceLocation > SelLocs={})
Sets the method's parameters and selector source locations.
bool hasRelatedResultType() const
Determine whether this method has a result type that is related to the message receiver's type.
Selector getSelector() const
bool isInstanceMethod() const
QualType getReturnType() const
ObjCInterfaceDecl * getClassInterface()
Represents a pointer to an Objective C object.
QualType getPointeeType() const
Gets the type pointed to by this ObjC pointer.
bool isObjCClassType() const
True if this is equivalent to the 'Class' type, i.e.
ObjCPropertyQueryKind getQueryKind() const
QualType getUsageType(QualType objectType) const
Retrieve the type when this property is used with a specific base object type.
Selector getSetterName() const
Selector getGetterName() const
ObjCPropertyAttribute::Kind getPropertyAttributes() const
ObjCPropertyRefExpr - A dot-syntax expression to access an ObjC property.
bool isMessagingGetter() const
True if the property reference will result in a message to the getter.
ObjCPropertyDecl * getExplicitProperty() const
ObjCMethodDecl * getImplicitPropertyGetter() const
void setIsMessagingSetter(bool val=true)
const Expr * getBase() const
bool isObjectReceiver() const
bool isExplicitProperty() const
void setIsMessagingGetter(bool val=true)
QualType getSuperReceiverType() const
bool isImplicitProperty() const
ObjCMethodDecl * getImplicitPropertySetter() const
ObjCInterfaceDecl * getClassReceiver() const
SourceLocation getLocation() const
QualType getReceiverType(const ASTContext &ctx) const
Determine the type of the base, regardless of the kind of receiver.
bool isClassReceiver() const
bool isSuperReceiver() const
ObjCSubscriptRefExpr - used for array and dictionary subscripting.
Expr * getKeyExpr() const
Expr * getBaseExpr() const
ObjCMethodDecl * getAtIndexMethodDecl() const
SourceLocation getRBracket() const
ObjCMethodDecl * setAtIndexMethodDecl() const
OpaqueValueExpr - An expression referring to an opaque object of a fixed type and value class.
Expr * getSourceExpr() const
The source expression of an opaque value expression is the expression which originally generated the ...
static ParmVarDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, const IdentifierInfo *Id, QualType T, TypeSourceInfo *TInfo, StorageClass S, Expr *DefArg)
IdentifierTable & getIdentifierTable()
SelectorTable & getSelectorTable()
PseudoObjectExpr - An expression which accesses a pseudo-object l-value.
static PseudoObjectExpr * Create(const ASTContext &Context, Expr *syntactic, ArrayRef< Expr * > semantic, unsigned resultIndex)
Expr * getSyntacticForm()
Return the syntactic form of this expression, i.e.
A (possibly-)qualified type.
bool isNull() const
Return true if this QualType doesn't point to a type yet.
Qualifiers::ObjCLifetime getObjCLifetime() const
Returns lifetime attribute of this type.
@ OCL_Weak
Reading or writing from this object requires a barrier call.
Scope - A scope is a transient data structure that is used while parsing the program.
static Selector constructSetterSelector(IdentifierTable &Idents, SelectorTable &SelTable, const IdentifierInfo *Name)
Return the default setter selector for the given identifier.
Selector getNullarySelector(const IdentifierInfo *ID)
Selector getSelector(unsigned NumArgs, const IdentifierInfo **IIV)
Can create any sort of selector.
Smart pointer class that efficiently represents Objective-C method names.
const IdentifierInfo * getIdentifierInfoForSlot(unsigned argIndex) const
Retrieve the identifier at a given position in the selector.
SemaDiagnosticBuilder Diag(SourceLocation Loc, unsigned DiagID)
Emit a diagnostic.
bool DiagnosePropertyAccessorMismatch(ObjCPropertyDecl *PD, ObjCMethodDecl *Getter, SourceLocation Loc)
ObjCSubscriptKind CheckSubscriptingKind(Expr *FromE)
CheckSubscriptingKind - This routine decide what type of indexing represented by "FromE" is being don...
ObjCMethodDecl * LookupInstanceMethodInGlobalPool(Selector Sel, SourceRange R, bool receiverIdOrClass=false)
LookupInstanceMethodInGlobalPool - Returns the method and warns if there are multiple signatures.
ObjCMethodDecl * LookupMethodInObjectType(Selector Sel, QualType Ty, bool IsInstance)
LookupMethodInType - Look up a method in an ObjCObjectType.
ExprResult BuildClassMessageImplicit(QualType ReceiverType, bool isSuperReceiver, SourceLocation Loc, Selector Sel, ObjCMethodDecl *Method, MultiExprArg Args)
ExprResult BuildInstanceMessageImplicit(Expr *Receiver, QualType ReceiverType, SourceLocation Loc, Selector Sel, ObjCMethodDecl *Method, MultiExprArg Args)
void checkRetainCycles(ObjCMessageExpr *msg)
checkRetainCycles - Check whether an Objective-C message send might create an obvious retain cycle.
ARCConversionResult CheckObjCConversion(SourceRange castRange, QualType castType, Expr *&op, CheckedConversionKind CCK, bool Diagnose=true, bool DiagnoseCFAudited=false, BinaryOperatorKind Opc=BO_PtrMemD, bool IsReinterpretCast=false)
Checks for invalid conversions and casts between retainable pointers and other pointer kinds for ARC ...
bool isSelfExpr(Expr *RExpr)
Private Helper predicate to check for 'self'.
SemaPseudoObject(Sema &S)
ExprResult checkAssignment(Scope *S, SourceLocation OpLoc, BinaryOperatorKind Opcode, Expr *LHS, Expr *RHS)
ExprResult checkIncDec(Scope *S, SourceLocation OpLoc, UnaryOperatorKind Opcode, Expr *Op)
Check an increment or decrement of a pseudo-object expression.
Expr * recreateSyntacticForm(PseudoObjectExpr *E)
Given a pseudo-object expression, recreate what it looks like syntactically without the attendant Opa...
ExprResult checkRValue(Expr *E)
Sema - This implements semantic analysis and AST building for C.
Scope * getCurScope() const
Retrieve the parser's current scope.
FPOptionsOverride CurFPFeatureOverrides()
AssignConvertType CheckSingleAssignmentConstraints(QualType LHSType, ExprResult &RHS, bool Diagnose=true, bool DiagnoseCFAudited=false, bool ConvertRHS=true)
Check assignment constraints for an assignment of RHS to LHSType.
ExprResult BuildUnaryOp(Scope *S, SourceLocation OpLoc, UnaryOperatorKind Opc, Expr *Input, bool IsAfterAmp=false)
ExprResult ImpCastExprToType(Expr *E, QualType Type, CastKind CK, ExprValueKind VK=VK_PRValue, const CXXCastPath *BasePath=nullptr, CheckedConversionKind CCK=CheckedConversionKind::Implicit)
ImpCastExprToType - If Expr is not of type 'Type', insert an implicit cast.
const LangOptions & getLangOpts() const
ExprResult BuildCallExpr(Scope *S, Expr *Fn, SourceLocation LParenLoc, MultiExprArg ArgExprs, SourceLocation RParenLoc, Expr *ExecConfig=nullptr, bool IsExecConfig=false, bool AllowRecovery=false)
BuildCallExpr - Handle a call to Fn with the specified array of arguments.
DeclContext * getCurLexicalContext() const
sema::FunctionScopeInfo * getCurFunction() const
void checkUnsafeExprAssigns(SourceLocation Loc, Expr *LHS, Expr *RHS)
checkUnsafeExprAssigns - Check whether +1 expr is being assigned to weak/__unsafe_unretained expressi...
ExprResult ActOnMemberAccessExpr(Scope *S, Expr *Base, SourceLocation OpLoc, tok::TokenKind OpKind, CXXScopeSpec &SS, SourceLocation TemplateKWLoc, UnqualifiedId &Member, Decl *ObjCImpDecl)
The main callback when the parser finds something like expression .
DeclContext * CurContext
CurContext - This is the current declaration context of parsing.
bool isUnevaluatedContext() const
Determines whether we are currently in a context that is not evaluated as per C++ [expr] p5.
bool DiagnoseUseOfDecl(NamedDecl *D, ArrayRef< SourceLocation > Locs, const ObjCInterfaceDecl *UnknownObjCClass=nullptr, bool ObjCPropertyAccess=false, bool AvoidPartialAvailabilityChecks=false, ObjCInterfaceDecl *ClassReciever=nullptr, bool SkipTrailingRequiresClause=false)
Determine whether the use of this declaration is valid, and emit any corresponding diagnostics.
DiagnosticsEngine & Diags
ExprResult BuildBinOp(Scope *S, SourceLocation OpLoc, BinaryOperatorKind Opc, Expr *LHSExpr, Expr *RHSExpr, bool ForFoldExpression=false)
bool DiagnoseAssignmentResult(AssignConvertType ConvTy, SourceLocation Loc, QualType DstType, QualType SrcType, Expr *SrcExpr, AssignmentAction Action, bool *Complained=nullptr)
DiagnoseAssignmentResult - Emit a diagnostic, if required, for the assignment conversion type specifi...
Encodes a location in the source.
SourceLocation getEnd() const
SourceLocation getBegin() const
SourceRange getSourceRange() const LLVM_READONLY
SourceLocation tokens are not useful in isolation - they are low level value objects created/interpre...
SourceLocation getBeginLoc() const LLVM_READONLY
CXXRecordDecl * getAsCXXRecordDecl() const
Retrieves the CXXRecordDecl that this type refers to, either because the type is a RecordType or beca...
const T * castAs() const
Member-template castAs<specific type>.
QualType getPointeeType() const
If this is a pointer, ObjC object pointer, or block pointer, this returns the respective pointee.
bool isIntegralOrEnumerationType() const
Determine whether this type is an integral or enumeration type.
bool isNonOverloadPlaceholderType() const
Test for a placeholder type other than Overload; see BuiltinType::isNonOverloadPlaceholderType.
bool isLValueReferenceType() const
bool isDependentType() const
Whether this type is a dependent type, meaning that its definition somehow depends on a template para...
bool isObjCIdType() const
bool isIncompleteType(NamedDecl **Def=nullptr) const
Types are partitioned into 3 broad categories (C99 6.2.5p1): object types, function types,...
bool isObjCObjectPointerType() const
const T * getAs() const
Member-template getAs<specific type>'.
bool isRecordType() const
UnaryOperator - This represents the unary-expression's (except sizeof and alignof),...
bool isDecrementOp() const
static bool isIncrementDecrementOp(Opcode Op)
static UnaryOperator * Create(const ASTContext &C, Expr *input, Opcode opc, QualType type, ExprValueKind VK, ExprObjectKind OK, SourceLocation l, bool CanOverflow, FPOptionsOverride FPFeatures)
bool isIncrementDecrementOp() const
bool isIncrementOp() const
void setIdentifier(const IdentifierInfo *Id, SourceLocation IdLoc)
Specify that this unqualified-id was parsed as an identifier.
void recordUseOfWeak(const ExprT *E, bool IsRead=true)
Record that a weak object was accessed.
void markSafeWeakUse(const Expr *E)
Record that a given expression is a "safe" access of a weak object (e.g.
The JSON file list parser is used to communicate input to InstallAPI.
bool isa(CodeGen::Address addr)
if(T->getSizeExpr()) TRY_TO(TraverseStmt(const_cast< Expr * >(T -> getSizeExpr())))
LLVM_READONLY char toLowercase(char c)
Converts the given ASCII character to its lowercase equivalent.
@ OK_Ordinary
An ordinary object is located at an address in memory.
nullptr
This class represents a compute construct, representing a 'Kind' of ‘parallel’, 'serial',...
MutableArrayRef< Expr * > MultiExprArg
const FunctionProtoType * T
AssignConvertType
AssignConvertType - All of the 'assignment' semantic checks return this enum to indicate whether the ...
LLVM_READONLY bool isLowercase(unsigned char c)
Return true if this character is a lowercase ASCII letter: [a-z].
LLVM_READONLY char toUppercase(char c)
Converts the given ASCII character to its uppercase equivalent.
@ VK_PRValue
A pr-value expression (in the C++11 taxonomy) produces a temporary value.
@ VK_LValue
An l-value expression is a reference to an object with independent storage.
U cast(CodeGen::Address addr)
ActionResult< Expr * > ExprResult
@ Implicit
An implicit conversion.
__DEVICE__ _Tp arg(const std::complex< _Tp > &__c)