003 File Manager
Current Path:
/usr/src/contrib/llvm-project/clang/lib/AST
usr
/
src
/
contrib
/
llvm-project
/
clang
/
lib
/
AST
/
📁
..
📄
APValue.cpp
(23.33 KB)
📄
ASTConcept.cpp
(2.7 KB)
📄
ASTConsumer.cpp
(954 B)
📄
ASTContext.cpp
(407.36 KB)
📄
ASTDiagnostic.cpp
(75.78 KB)
📄
ASTDumper.cpp
(9.52 KB)
📄
ASTImporter.cpp
(323.93 KB)
📄
ASTImporterLookupTable.cpp
(4.85 KB)
📄
ASTStructuralEquivalence.cpp
(73.55 KB)
📄
ASTTypeTraits.cpp
(6.42 KB)
📄
AttrImpl.cpp
(5.3 KB)
📄
CXXABI.h
(2.66 KB)
📄
CXXInheritance.cpp
(28.55 KB)
📄
Comment.cpp
(11.94 KB)
📄
CommentBriefParser.cpp
(4.19 KB)
📄
CommentCommandTraits.cpp
(4.63 KB)
📄
CommentLexer.cpp
(25.38 KB)
📄
CommentParser.cpp
(23.52 KB)
📄
CommentSema.cpp
(40.88 KB)
📄
ComparisonCategories.cpp
(7.23 KB)
📄
ComputeDependence.cpp
(28.3 KB)
📄
DataCollection.cpp
(1.83 KB)
📄
Decl.cpp
(177.21 KB)
📄
DeclBase.cpp
(63.37 KB)
📄
DeclCXX.cpp
(127.53 KB)
📄
DeclFriend.cpp
(2.76 KB)
📄
DeclGroup.cpp
(1.16 KB)
📄
DeclObjC.cpp
(82.05 KB)
📄
DeclOpenMP.cpp
(10.04 KB)
📄
DeclPrinter.cpp
(52.6 KB)
📄
DeclTemplate.cpp
(57.75 KB)
📄
DeclarationName.cpp
(17.52 KB)
📄
Expr.cpp
(176.93 KB)
📄
ExprCXX.cpp
(69.03 KB)
📄
ExprClassification.cpp
(28.48 KB)
📄
ExprConcepts.cpp
(9.43 KB)
📄
ExprConstant.cpp
(538.88 KB)
📄
ExprObjC.cpp
(14.25 KB)
📄
ExternalASTMerger.cpp
(22.13 KB)
📄
ExternalASTSource.cpp
(3.85 KB)
📄
FormatString.cpp
(29.64 KB)
📄
FormatStringParsing.h
(3.17 KB)
📄
InheritViz.cpp
(5.1 KB)
📁
Interp
📄
ItaniumCXXABI.cpp
(8.92 KB)
📄
ItaniumMangle.cpp
(182.64 KB)
📄
JSONNodeDumper.cpp
(58.07 KB)
📄
Linkage.h
(6 KB)
📄
Mangle.cpp
(17.71 KB)
📄
MicrosoftCXXABI.cpp
(9.12 KB)
📄
MicrosoftMangle.cpp
(133.01 KB)
📄
NSAPI.cpp
(18.12 KB)
📄
NestedNameSpecifier.cpp
(23.31 KB)
📄
ODRHash.cpp
(29.78 KB)
📄
OSLog.cpp
(7.61 KB)
📄
OpenMPClause.cpp
(82.03 KB)
📄
ParentMap.cpp
(5.97 KB)
📄
ParentMapContext.cpp
(10.7 KB)
📄
PrintfFormatString.cpp
(35.8 KB)
📄
QualTypeNames.cpp
(18.46 KB)
📄
RawCommentList.cpp
(15.52 KB)
📄
RecordLayout.cpp
(3.95 KB)
📄
RecordLayoutBuilder.cpp
(132.78 KB)
📄
ScanfFormatString.cpp
(18.62 KB)
📄
SelectorLocationsKind.cpp
(4.48 KB)
📄
Stmt.cpp
(45.04 KB)
📄
StmtCXX.cpp
(5 KB)
📄
StmtIterator.cpp
(2.92 KB)
📄
StmtObjC.cpp
(2.75 KB)
📄
StmtOpenMP.cpp
(98.6 KB)
📄
StmtPrinter.cpp
(70.34 KB)
📄
StmtProfile.cpp
(60.24 KB)
📄
StmtViz.cpp
(1.75 KB)
📄
TemplateBase.cpp
(16.19 KB)
📄
TemplateName.cpp
(9.96 KB)
📄
TextNodeDumper.cpp
(61.83 KB)
📄
Type.cpp
(144.42 KB)
📄
TypeLoc.cpp
(20.52 KB)
📄
TypePrinter.cpp
(63.28 KB)
📄
VTTBuilder.cpp
(7.25 KB)
📄
VTableBuilder.cpp
(139.78 KB)
Editing: ExprObjC.cpp
//===- ExprObjC.cpp - (ObjC) Expression AST Node Implementation -----------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // // This file implements the subclesses of Expr class declared in ExprObjC.h // //===----------------------------------------------------------------------===// #include "clang/AST/ExprObjC.h" #include "clang/AST/ASTContext.h" #include "clang/AST/ComputeDependence.h" #include "clang/AST/DependenceFlags.h" #include "clang/AST/SelectorLocationsKind.h" #include "clang/AST/Type.h" #include "clang/AST/TypeLoc.h" #include "llvm/ADT/SmallVector.h" #include "llvm/Support/ErrorHandling.h" #include <algorithm> #include <cassert> #include <cstdint> using namespace clang; ObjCArrayLiteral::ObjCArrayLiteral(ArrayRef<Expr *> Elements, QualType T, ObjCMethodDecl *Method, SourceRange SR) : Expr(ObjCArrayLiteralClass, T, VK_RValue, OK_Ordinary), NumElements(Elements.size()), Range(SR), ArrayWithObjectsMethod(Method) { Expr **SaveElements = getElements(); for (unsigned I = 0, N = Elements.size(); I != N; ++I) SaveElements[I] = Elements[I]; setDependence(computeDependence(this)); } ObjCArrayLiteral *ObjCArrayLiteral::Create(const ASTContext &C, ArrayRef<Expr *> Elements, QualType T, ObjCMethodDecl *Method, SourceRange SR) { void *Mem = C.Allocate(totalSizeToAlloc<Expr *>(Elements.size())); return new (Mem) ObjCArrayLiteral(Elements, T, Method, SR); } ObjCArrayLiteral *ObjCArrayLiteral::CreateEmpty(const ASTContext &C, unsigned NumElements) { void *Mem = C.Allocate(totalSizeToAlloc<Expr *>(NumElements)); return new (Mem) ObjCArrayLiteral(EmptyShell(), NumElements); } ObjCDictionaryLiteral::ObjCDictionaryLiteral(ArrayRef<ObjCDictionaryElement> VK, bool HasPackExpansions, QualType T, ObjCMethodDecl *method, SourceRange SR) : Expr(ObjCDictionaryLiteralClass, T, VK_RValue, OK_Ordinary), NumElements(VK.size()), HasPackExpansions(HasPackExpansions), Range(SR), DictWithObjectsMethod(method) { KeyValuePair *KeyValues = getTrailingObjects<KeyValuePair>(); ExpansionData *Expansions = HasPackExpansions ? getTrailingObjects<ExpansionData>() : nullptr; for (unsigned I = 0; I < NumElements; I++) { KeyValues[I].Key = VK[I].Key; KeyValues[I].Value = VK[I].Value; if (Expansions) { Expansions[I].EllipsisLoc = VK[I].EllipsisLoc; if (VK[I].NumExpansions) Expansions[I].NumExpansionsPlusOne = *VK[I].NumExpansions + 1; else Expansions[I].NumExpansionsPlusOne = 0; } } setDependence(computeDependence(this)); } ObjCDictionaryLiteral * ObjCDictionaryLiteral::Create(const ASTContext &C, ArrayRef<ObjCDictionaryElement> VK, bool HasPackExpansions, QualType T, ObjCMethodDecl *method, SourceRange SR) { void *Mem = C.Allocate(totalSizeToAlloc<KeyValuePair, ExpansionData>( VK.size(), HasPackExpansions ? VK.size() : 0)); return new (Mem) ObjCDictionaryLiteral(VK, HasPackExpansions, T, method, SR); } ObjCDictionaryLiteral * ObjCDictionaryLiteral::CreateEmpty(const ASTContext &C, unsigned NumElements, bool HasPackExpansions) { void *Mem = C.Allocate(totalSizeToAlloc<KeyValuePair, ExpansionData>( NumElements, HasPackExpansions ? NumElements : 0)); return new (Mem) ObjCDictionaryLiteral(EmptyShell(), NumElements, HasPackExpansions); } QualType ObjCPropertyRefExpr::getReceiverType(const ASTContext &ctx) const { if (isClassReceiver()) return ctx.getObjCInterfaceType(getClassReceiver()); if (isSuperReceiver()) return getSuperReceiverType(); return getBase()->getType(); } ObjCMessageExpr::ObjCMessageExpr(QualType T, ExprValueKind VK, SourceLocation LBracLoc, SourceLocation SuperLoc, bool IsInstanceSuper, QualType SuperType, Selector Sel, ArrayRef<SourceLocation> SelLocs, SelectorLocationsKind SelLocsK, ObjCMethodDecl *Method, ArrayRef<Expr *> Args, SourceLocation RBracLoc, bool isImplicit) : Expr(ObjCMessageExprClass, T, VK, OK_Ordinary), SelectorOrMethod( reinterpret_cast<uintptr_t>(Method ? Method : Sel.getAsOpaquePtr())), Kind(IsInstanceSuper ? SuperInstance : SuperClass), HasMethod(Method != nullptr), IsDelegateInitCall(false), IsImplicit(isImplicit), SuperLoc(SuperLoc), LBracLoc(LBracLoc), RBracLoc(RBracLoc) { initArgsAndSelLocs(Args, SelLocs, SelLocsK); setReceiverPointer(SuperType.getAsOpaquePtr()); setDependence(computeDependence(this)); } ObjCMessageExpr::ObjCMessageExpr(QualType T, ExprValueKind VK, SourceLocation LBracLoc, TypeSourceInfo *Receiver, Selector Sel, ArrayRef<SourceLocation> SelLocs, SelectorLocationsKind SelLocsK, ObjCMethodDecl *Method, ArrayRef<Expr *> Args, SourceLocation RBracLoc, bool isImplicit) : Expr(ObjCMessageExprClass, T, VK, OK_Ordinary), SelectorOrMethod( reinterpret_cast<uintptr_t>(Method ? Method : Sel.getAsOpaquePtr())), Kind(Class), HasMethod(Method != nullptr), IsDelegateInitCall(false), IsImplicit(isImplicit), LBracLoc(LBracLoc), RBracLoc(RBracLoc) { initArgsAndSelLocs(Args, SelLocs, SelLocsK); setReceiverPointer(Receiver); setDependence(computeDependence(this)); } ObjCMessageExpr::ObjCMessageExpr(QualType T, ExprValueKind VK, SourceLocation LBracLoc, Expr *Receiver, Selector Sel, ArrayRef<SourceLocation> SelLocs, SelectorLocationsKind SelLocsK, ObjCMethodDecl *Method, ArrayRef<Expr *> Args, SourceLocation RBracLoc, bool isImplicit) : Expr(ObjCMessageExprClass, T, VK, OK_Ordinary), SelectorOrMethod( reinterpret_cast<uintptr_t>(Method ? Method : Sel.getAsOpaquePtr())), Kind(Instance), HasMethod(Method != nullptr), IsDelegateInitCall(false), IsImplicit(isImplicit), LBracLoc(LBracLoc), RBracLoc(RBracLoc) { initArgsAndSelLocs(Args, SelLocs, SelLocsK); setReceiverPointer(Receiver); setDependence(computeDependence(this)); } void ObjCMessageExpr::initArgsAndSelLocs(ArrayRef<Expr *> Args, ArrayRef<SourceLocation> SelLocs, SelectorLocationsKind SelLocsK) { setNumArgs(Args.size()); Expr **MyArgs = getArgs(); for (unsigned I = 0; I != Args.size(); ++I) MyArgs[I] = Args[I]; SelLocsKind = SelLocsK; if (!isImplicit()) { if (SelLocsK == SelLoc_NonStandard) std::copy(SelLocs.begin(), SelLocs.end(), getStoredSelLocs()); } } ObjCMessageExpr * ObjCMessageExpr::Create(const ASTContext &Context, QualType T, ExprValueKind VK, SourceLocation LBracLoc, SourceLocation SuperLoc, bool IsInstanceSuper, QualType SuperType, Selector Sel, ArrayRef<SourceLocation> SelLocs, ObjCMethodDecl *Method, ArrayRef<Expr *> Args, SourceLocation RBracLoc, bool isImplicit) { assert((!SelLocs.empty() || isImplicit) && "No selector locs for non-implicit message"); ObjCMessageExpr *Mem; SelectorLocationsKind SelLocsK = SelectorLocationsKind(); if (isImplicit) Mem = alloc(Context, Args.size(), 0); else Mem = alloc(Context, Args, RBracLoc, SelLocs, Sel, SelLocsK); return new (Mem) ObjCMessageExpr(T, VK, LBracLoc, SuperLoc, IsInstanceSuper, SuperType, Sel, SelLocs, SelLocsK, Method, Args, RBracLoc, isImplicit); } ObjCMessageExpr * ObjCMessageExpr::Create(const ASTContext &Context, QualType T, ExprValueKind VK, SourceLocation LBracLoc, TypeSourceInfo *Receiver, Selector Sel, ArrayRef<SourceLocation> SelLocs, ObjCMethodDecl *Method, ArrayRef<Expr *> Args, SourceLocation RBracLoc, bool isImplicit) { assert((!SelLocs.empty() || isImplicit) && "No selector locs for non-implicit message"); ObjCMessageExpr *Mem; SelectorLocationsKind SelLocsK = SelectorLocationsKind(); if (isImplicit) Mem = alloc(Context, Args.size(), 0); else Mem = alloc(Context, Args, RBracLoc, SelLocs, Sel, SelLocsK); return new (Mem) ObjCMessageExpr(T, VK, LBracLoc, Receiver, Sel, SelLocs, SelLocsK, Method, Args, RBracLoc, isImplicit); } ObjCMessageExpr * ObjCMessageExpr::Create(const ASTContext &Context, QualType T, ExprValueKind VK, SourceLocation LBracLoc, Expr *Receiver, Selector Sel, ArrayRef<SourceLocation> SelLocs, ObjCMethodDecl *Method, ArrayRef<Expr *> Args, SourceLocation RBracLoc, bool isImplicit) { assert((!SelLocs.empty() || isImplicit) && "No selector locs for non-implicit message"); ObjCMessageExpr *Mem; SelectorLocationsKind SelLocsK = SelectorLocationsKind(); if (isImplicit) Mem = alloc(Context, Args.size(), 0); else Mem = alloc(Context, Args, RBracLoc, SelLocs, Sel, SelLocsK); return new (Mem) ObjCMessageExpr(T, VK, LBracLoc, Receiver, Sel, SelLocs, SelLocsK, Method, Args, RBracLoc, isImplicit); } ObjCMessageExpr *ObjCMessageExpr::CreateEmpty(const ASTContext &Context, unsigned NumArgs, unsigned NumStoredSelLocs) { ObjCMessageExpr *Mem = alloc(Context, NumArgs, NumStoredSelLocs); return new (Mem) ObjCMessageExpr(EmptyShell(), NumArgs); } ObjCMessageExpr *ObjCMessageExpr::alloc(const ASTContext &C, ArrayRef<Expr *> Args, SourceLocation RBraceLoc, ArrayRef<SourceLocation> SelLocs, Selector Sel, SelectorLocationsKind &SelLocsK) { SelLocsK = hasStandardSelectorLocs(Sel, SelLocs, Args, RBraceLoc); unsigned NumStoredSelLocs = (SelLocsK == SelLoc_NonStandard) ? SelLocs.size() : 0; return alloc(C, Args.size(), NumStoredSelLocs); } ObjCMessageExpr *ObjCMessageExpr::alloc(const ASTContext &C, unsigned NumArgs, unsigned NumStoredSelLocs) { return (ObjCMessageExpr *)C.Allocate( totalSizeToAlloc<void *, SourceLocation>(NumArgs + 1, NumStoredSelLocs), alignof(ObjCMessageExpr)); } void ObjCMessageExpr::getSelectorLocs( SmallVectorImpl<SourceLocation> &SelLocs) const { for (unsigned i = 0, e = getNumSelectorLocs(); i != e; ++i) SelLocs.push_back(getSelectorLoc(i)); } QualType ObjCMessageExpr::getCallReturnType(ASTContext &Ctx) const { if (const ObjCMethodDecl *MD = getMethodDecl()) { QualType QT = MD->getReturnType(); if (QT == Ctx.getObjCInstanceType()) { // instancetype corresponds to expression types. return getType(); } return QT; } // Expression type might be different from an expected call return type, // as expression type would never be a reference even if call returns a // reference. Reconstruct the original expression type. QualType QT = getType(); switch (getValueKind()) { case VK_LValue: return Ctx.getLValueReferenceType(QT); case VK_XValue: return Ctx.getRValueReferenceType(QT); case VK_RValue: return QT; } llvm_unreachable("Unsupported ExprValueKind"); } SourceRange ObjCMessageExpr::getReceiverRange() const { switch (getReceiverKind()) { case Instance: return getInstanceReceiver()->getSourceRange(); case Class: return getClassReceiverTypeInfo()->getTypeLoc().getSourceRange(); case SuperInstance: case SuperClass: return getSuperLoc(); } llvm_unreachable("Invalid ReceiverKind!"); } Selector ObjCMessageExpr::getSelector() const { if (HasMethod) return reinterpret_cast<const ObjCMethodDecl *>(SelectorOrMethod) ->getSelector(); return Selector(SelectorOrMethod); } QualType ObjCMessageExpr::getReceiverType() const { switch (getReceiverKind()) { case Instance: return getInstanceReceiver()->getType(); case Class: return getClassReceiver(); case SuperInstance: case SuperClass: return getSuperType(); } llvm_unreachable("unexpected receiver kind"); } ObjCInterfaceDecl *ObjCMessageExpr::getReceiverInterface() const { QualType T = getReceiverType(); if (const ObjCObjectPointerType *Ptr = T->getAs<ObjCObjectPointerType>()) return Ptr->getInterfaceDecl(); if (const ObjCObjectType *Ty = T->getAs<ObjCObjectType>()) return Ty->getInterface(); return nullptr; } Stmt::child_range ObjCMessageExpr::children() { Stmt **begin; if (getReceiverKind() == Instance) begin = reinterpret_cast<Stmt **>(getTrailingObjects<void *>()); else begin = reinterpret_cast<Stmt **>(getArgs()); return child_range(begin, reinterpret_cast<Stmt **>(getArgs() + getNumArgs())); } Stmt::const_child_range ObjCMessageExpr::children() const { auto Children = const_cast<ObjCMessageExpr *>(this)->children(); return const_child_range(Children.begin(), Children.end()); } StringRef ObjCBridgedCastExpr::getBridgeKindName() const { switch (getBridgeKind()) { case OBC_Bridge: return "__bridge"; case OBC_BridgeTransfer: return "__bridge_transfer"; case OBC_BridgeRetained: return "__bridge_retained"; } llvm_unreachable("Invalid BridgeKind!"); }
Upload File
Create Folder