It also crashes during clang selfhost with modules and libc++. Let me know if you need a precise reproducer command.
I reverted this change and the dependent r362563 in r362597. On Wed, Jun 5, 2019 at 9:37 AM Martin Storsjö via cfe-commits < cfe-commits@lists.llvm.org> wrote: > This broke building of Qt when using PCH. Selfcontained repro is a bit > hard to make though... > > // Martin > > On Tue, 4 Jun 2019, Richard Smith via cfe-commits wrote: > > > Author: rsmith > > Date: Tue Jun 4 14:29:28 2019 > > New Revision: 362551 > > > > URL: http://llvm.org/viewvc/llvm-project?rev=362551&view=rev > > Log: > > Convert MemberExpr creation and serialization to work the same way as > > most / all other Expr subclasses. > > > > Modified: > > cfe/trunk/include/clang/AST/Expr.h > > cfe/trunk/include/clang/AST/Stmt.h > > cfe/trunk/lib/AST/DeclBase.cpp > > cfe/trunk/lib/AST/Expr.cpp > > cfe/trunk/lib/Frontend/Rewrite/RewriteModernObjC.cpp > > cfe/trunk/lib/Frontend/Rewrite/RewriteObjC.cpp > > cfe/trunk/lib/Sema/SemaExprCXX.cpp > > cfe/trunk/lib/Serialization/ASTReaderStmt.cpp > > cfe/trunk/lib/Serialization/ASTWriterStmt.cpp > > > > Modified: cfe/trunk/include/clang/AST/Expr.h > > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/Expr.h?rev=362551&r1=362550&r2=362551&view=diff > > > ============================================================================== > > --- cfe/trunk/include/clang/AST/Expr.h (original) > > +++ cfe/trunk/include/clang/AST/Expr.h Tue Jun 4 14:29:28 2019 > > @@ -2735,6 +2735,7 @@ class MemberExpr final > > ASTTemplateKWAndArgsInfo, > > TemplateArgumentLoc> { > > friend class ASTReader; > > + friend class ASTStmtReader; > > friend class ASTStmtWriter; > > friend TrailingObjects; > > > > @@ -2769,49 +2770,38 @@ class MemberExpr final > > return MemberExprBits.HasTemplateKWAndArgsInfo; > > } > > > > -public: > > - MemberExpr(Expr *base, bool isarrow, SourceLocation operatorloc, > > - ValueDecl *memberdecl, const DeclarationNameInfo &NameInfo, > > - QualType ty, ExprValueKind VK, ExprObjectKind OK) > > - : Expr(MemberExprClass, ty, VK, OK, base->isTypeDependent(), > > - base->isValueDependent(), base->isInstantiationDependent(), > > - base->containsUnexpandedParameterPack()), > > - Base(base), MemberDecl(memberdecl), > MemberDNLoc(NameInfo.getInfo()), > > - MemberLoc(NameInfo.getLoc()) { > > - assert(memberdecl->getDeclName() == NameInfo.getName()); > > - MemberExprBits.IsArrow = isarrow; > > - MemberExprBits.HasQualifierOrFoundDecl = false; > > - MemberExprBits.HasTemplateKWAndArgsInfo = false; > > - MemberExprBits.HadMultipleCandidates = false; > > - MemberExprBits.OperatorLoc = operatorloc; > > - } > > - > > - // NOTE: this constructor should be used only when it is known that > > - // the member name can not provide additional syntactic info > > - // (i.e., source locations for C++ operator names or type source info > > - // for constructors, destructors and conversion operators). > > - MemberExpr(Expr *base, bool isarrow, SourceLocation operatorloc, > > - ValueDecl *memberdecl, SourceLocation l, QualType ty, > > - ExprValueKind VK, ExprObjectKind OK) > > - : Expr(MemberExprClass, ty, VK, OK, base->isTypeDependent(), > > - base->isValueDependent(), base->isInstantiationDependent(), > > - base->containsUnexpandedParameterPack()), > > - Base(base), MemberDecl(memberdecl), MemberDNLoc(), MemberLoc(l) > { > > - MemberExprBits.IsArrow = isarrow; > > - MemberExprBits.HasQualifierOrFoundDecl = false; > > - MemberExprBits.HasTemplateKWAndArgsInfo = false; > > - MemberExprBits.HadMultipleCandidates = false; > > - MemberExprBits.OperatorLoc = operatorloc; > > - } > > + MemberExpr(Expr *Base, bool IsArrow, SourceLocation OperatorLoc, > > + ValueDecl *MemberDecl, const DeclarationNameInfo &NameInfo, > > + QualType T, ExprValueKind VK, ExprObjectKind OK); > > + MemberExpr(EmptyShell Empty) > > + : Expr(MemberExprClass, Empty), Base(), MemberDecl() {} > > > > - static MemberExpr *Create(const ASTContext &C, Expr *base, bool > isarrow, > > +public: > > + static MemberExpr *Create(const ASTContext &C, Expr *Base, bool > IsArrow, > > SourceLocation OperatorLoc, > > NestedNameSpecifierLoc QualifierLoc, > > - SourceLocation TemplateKWLoc, ValueDecl > *memberdecl, > > - DeclAccessPair founddecl, > > + SourceLocation TemplateKWLoc, ValueDecl > *MemberDecl, > > + DeclAccessPair FoundDecl, > > DeclarationNameInfo MemberNameInfo, > > - const TemplateArgumentListInfo *targs, > QualType ty, > > - ExprValueKind VK, ExprObjectKind OK); > > + const TemplateArgumentListInfo > *TemplateArgs, > > + QualType T, ExprValueKind VK, > ExprObjectKind OK); > > + > > + /// Create an implicit MemberExpr, with no location, qualifier, > template > > + /// arguments, and so on. > > + static MemberExpr *CreateImplicit(const ASTContext &C, Expr *Base, > > + bool IsArrow, ValueDecl *MemberDecl, > > + QualType T, ExprValueKind VK, > > + ExprObjectKind OK) { > > + return Create(C, Base, IsArrow, SourceLocation(), > NestedNameSpecifierLoc(), > > + SourceLocation(), MemberDecl, > > + DeclAccessPair::make(MemberDecl, > MemberDecl->getAccess()), > > + DeclarationNameInfo(), nullptr, T, VK, OK); > > + } > > + > > + static MemberExpr *CreateEmpty(const ASTContext &Context, bool > HasQualifier, > > + bool HasFoundDecl, > > + bool HasTemplateKWAndArgsInfo, > > + unsigned NumTemplateArgs); > > > > void setBase(Expr *E) { Base = E; } > > Expr *getBase() const { return cast<Expr>(Base); } > > > > Modified: cfe/trunk/include/clang/AST/Stmt.h > > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/Stmt.h?rev=362551&r1=362550&r2=362551&view=diff > > > ============================================================================== > > --- cfe/trunk/include/clang/AST/Stmt.h (original) > > +++ cfe/trunk/include/clang/AST/Stmt.h Tue Jun 4 14:29:28 2019 > > @@ -453,6 +453,7 @@ protected: > > enum { NumCallExprBits = 32 }; > > > > class MemberExprBitfields { > > + friend class ASTStmtReader; > > friend class MemberExpr; > > > > unsigned : NumExprBits; > > > > Modified: cfe/trunk/lib/AST/DeclBase.cpp > > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/DeclBase.cpp?rev=362551&r1=362550&r2=362551&view=diff > > > ============================================================================== > > --- cfe/trunk/lib/AST/DeclBase.cpp (original) > > +++ cfe/trunk/lib/AST/DeclBase.cpp Tue Jun 4 14:29:28 2019 > > @@ -920,6 +920,7 @@ bool Decl::AccessDeclContextSanity() con > > if (isa<TranslationUnitDecl>(this) || > > isa<TemplateTypeParmDecl>(this) || > > isa<NonTypeTemplateParmDecl>(this) || > > + !getDeclContext() || > > !isa<CXXRecordDecl>(getDeclContext()) || > > isInvalidDecl() || > > isa<StaticAssertDecl>(this) || > > > > Modified: cfe/trunk/lib/AST/Expr.cpp > > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/Expr.cpp?rev=362551&r1=362550&r2=362551&view=diff > > > ============================================================================== > > --- cfe/trunk/lib/AST/Expr.cpp (original) > > +++ cfe/trunk/lib/AST/Expr.cpp Tue Jun 4 14:29:28 2019 > > @@ -1538,29 +1538,44 @@ UnaryExprOrTypeTraitExpr::UnaryExprOrTyp > > } > > } > > > > +MemberExpr::MemberExpr(Expr *Base, bool IsArrow, SourceLocation > OperatorLoc, > > + ValueDecl *MemberDecl, > > + const DeclarationNameInfo &NameInfo, QualType T, > > + ExprValueKind VK, ExprObjectKind OK) > > + : Expr(MemberExprClass, T, VK, OK, Base->isTypeDependent(), > > + Base->isValueDependent(), Base->isInstantiationDependent(), > > + Base->containsUnexpandedParameterPack()), > > + Base(Base), MemberDecl(MemberDecl), > MemberDNLoc(NameInfo.getInfo()), > > + MemberLoc(NameInfo.getLoc()) { > > + assert(!NameInfo.getName() || > > + MemberDecl->getDeclName() == NameInfo.getName()); > > + MemberExprBits.IsArrow = IsArrow; > > + MemberExprBits.HasQualifierOrFoundDecl = false; > > + MemberExprBits.HasTemplateKWAndArgsInfo = false; > > + MemberExprBits.HadMultipleCandidates = false; > > + MemberExprBits.OperatorLoc = OperatorLoc; > > +} > > + > > MemberExpr *MemberExpr::Create( > > - const ASTContext &C, Expr *base, bool isarrow, SourceLocation > OperatorLoc, > > + const ASTContext &C, Expr *Base, bool IsArrow, SourceLocation > OperatorLoc, > > NestedNameSpecifierLoc QualifierLoc, SourceLocation TemplateKWLoc, > > - ValueDecl *memberdecl, DeclAccessPair founddecl, > > - DeclarationNameInfo nameinfo, const TemplateArgumentListInfo *targs, > > - QualType ty, ExprValueKind vk, ExprObjectKind ok) { > > - > > - bool hasQualOrFound = (QualifierLoc || > > - founddecl.getDecl() != memberdecl || > > - founddecl.getAccess() != > memberdecl->getAccess()); > > - > > - bool HasTemplateKWAndArgsInfo = targs || TemplateKWLoc.isValid(); > > + ValueDecl *MemberDecl, DeclAccessPair FoundDecl, > > + DeclarationNameInfo NameInfo, const TemplateArgumentListInfo > *TemplateArgs, > > + QualType T, ExprValueKind VK, ExprObjectKind OK) { > > + bool HasQualOrFound = QualifierLoc || FoundDecl.getDecl() != > MemberDecl || > > + FoundDecl.getAccess() != > MemberDecl->getAccess(); > > + bool HasTemplateKWAndArgsInfo = TemplateArgs || > TemplateKWLoc.isValid(); > > std::size_t Size = > > totalSizeToAlloc<MemberExprNameQualifier, ASTTemplateKWAndArgsInfo, > > - TemplateArgumentLoc>(hasQualOrFound ? 1 : 0, > > - HasTemplateKWAndArgsInfo ? > 1 : 0, > > - targs ? targs->size() : 0); > > + TemplateArgumentLoc>( > > + HasQualOrFound ? 1 : 0, HasTemplateKWAndArgsInfo ? 1 : 0, > > + TemplateArgs ? TemplateArgs->size() : 0); > > > > void *Mem = C.Allocate(Size, alignof(MemberExpr)); > > MemberExpr *E = new (Mem) > > - MemberExpr(base, isarrow, OperatorLoc, memberdecl, nameinfo, ty, > vk, ok); > > + MemberExpr(Base, IsArrow, OperatorLoc, MemberDecl, NameInfo, T, > VK, OK); > > > > - if (hasQualOrFound) { > > + if (HasQualOrFound) { > > // FIXME: Wrong. We should be looking at the member declaration we > found. > > if (QualifierLoc && > QualifierLoc.getNestedNameSpecifier()->isDependent()) { > > E->setValueDependent(true); > > @@ -1576,19 +1591,20 @@ MemberExpr *MemberExpr::Create( > > MemberExprNameQualifier *NQ = > > E->getTrailingObjects<MemberExprNameQualifier>(); > > NQ->QualifierLoc = QualifierLoc; > > - NQ->FoundDecl = founddecl; > > + NQ->FoundDecl = FoundDecl; > > } > > > > E->MemberExprBits.HasTemplateKWAndArgsInfo = > > - (targs || TemplateKWLoc.isValid()); > > + TemplateArgs || TemplateKWLoc.isValid(); > > > > - if (targs) { > > + if (TemplateArgs) { > > bool Dependent = false; > > bool InstantiationDependent = false; > > bool ContainsUnexpandedParameterPack = false; > > E->getTrailingObjects<ASTTemplateKWAndArgsInfo>()->initializeFrom( > > - TemplateKWLoc, *targs, > E->getTrailingObjects<TemplateArgumentLoc>(), > > - Dependent, InstantiationDependent, > ContainsUnexpandedParameterPack); > > + TemplateKWLoc, *TemplateArgs, > > + E->getTrailingObjects<TemplateArgumentLoc>(), Dependent, > > + InstantiationDependent, ContainsUnexpandedParameterPack); > > if (InstantiationDependent) > > E->setInstantiationDependent(true); > > } else if (TemplateKWLoc.isValid()) { > > @@ -1599,6 +1615,22 @@ MemberExpr *MemberExpr::Create( > > return E; > > } > > > > +MemberExpr *MemberExpr::CreateEmpty(const ASTContext &Context, > > + bool HasQualifier, bool > HasFoundDecl, > > + bool HasTemplateKWAndArgsInfo, > > + unsigned NumTemplateArgs) { > > + assert((!NumTemplateArgs || HasTemplateKWAndArgsInfo) && > > + "template args but no template arg info?"); > > + bool HasQualOrFound = HasQualifier || HasFoundDecl; > > + std::size_t Size = > > + totalSizeToAlloc<MemberExprNameQualifier, > ASTTemplateKWAndArgsInfo, > > + TemplateArgumentLoc>(HasQualOrFound ? 1 : 0, > > + HasTemplateKWAndArgsInfo ? > 1 : 0, > > + NumTemplateArgs); > > + void *Mem = Context.Allocate(Size, alignof(MemberExpr)); > > + return new (Mem) MemberExpr(EmptyShell()); > > +} > > + > > SourceLocation MemberExpr::getBeginLoc() const { > > if (isImplicitAccess()) { > > if (hasQualifier()) > > > > Modified: cfe/trunk/lib/Frontend/Rewrite/RewriteModernObjC.cpp > > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/Rewrite/RewriteModernObjC.cpp?rev=362551&r1=362550&r2=362551&view=diff > > > ============================================================================== > > --- cfe/trunk/lib/Frontend/Rewrite/RewriteModernObjC.cpp (original) > > +++ cfe/trunk/lib/Frontend/Rewrite/RewriteModernObjC.cpp Tue Jun 4 > 14:29:28 2019 > > @@ -881,9 +881,8 @@ RewriteModernObjC::getIvarAccessString(O > > IvarT, nullptr, > > /*BitWidth=*/nullptr, > /*Mutable=*/true, > > ICIS_NoInit); > > - MemberExpr *ME = new (Context) > > - MemberExpr(PE, true, SourceLocation(), FD, SourceLocation(), > > - FD->getType(), VK_LValue, OK_Ordinary); > > + MemberExpr *ME = MemberExpr::CreateImplicit( > > + *Context, PE, true, FD, FD->getType(), VK_LValue, > OK_Ordinary); > > IvarT = Context->getDecltypeType(ME, ME->getType()); > > } > > } > > @@ -2736,9 +2735,9 @@ Stmt *RewriteModernObjC::RewriteObjCArra > > > Context->getPointerType(Context->VoidPtrTy), > > nullptr, /*BitWidth=*/nullptr, > > /*Mutable=*/true, ICIS_NoInit); > > - MemberExpr *ArrayLiteralME = new (Context) > > - MemberExpr(NSArrayCallExpr, false, SourceLocation(), ARRFD, > > - SourceLocation(), ARRFD->getType(), VK_LValue, > OK_Ordinary); > > + MemberExpr *ArrayLiteralME = > > + MemberExpr::CreateImplicit(*Context, NSArrayCallExpr, false, > ARRFD, > > + ARRFD->getType(), VK_LValue, > OK_Ordinary); > > QualType ConstIdT = Context->getObjCIdType().withConst(); > > CStyleCastExpr * ArrayLiteralObjects = > > NoTypeInfoCStyleCastExpr(Context, > > @@ -2865,9 +2864,9 @@ Stmt *RewriteModernObjC::RewriteObjCDict > > > Context->getPointerType(Context->VoidPtrTy), > > nullptr, /*BitWidth=*/nullptr, > > /*Mutable=*/true, ICIS_NoInit); > > - MemberExpr *DictLiteralValueME = new (Context) > > - MemberExpr(NSValueCallExpr, false, SourceLocation(), ARRFD, > > - SourceLocation(), ARRFD->getType(), VK_LValue, > OK_Ordinary); > > + MemberExpr *DictLiteralValueME = > > + MemberExpr::CreateImplicit(*Context, NSValueCallExpr, false, > ARRFD, > > + ARRFD->getType(), VK_LValue, > OK_Ordinary); > > QualType ConstIdT = Context->getObjCIdType().withConst(); > > CStyleCastExpr * DictValueObjects = > > NoTypeInfoCStyleCastExpr(Context, > > @@ -2878,9 +2877,9 @@ Stmt *RewriteModernObjC::RewriteObjCDict > > Expr *NSKeyCallExpr = CallExpr::Create( > > *Context, NSDictDRE, KeyExprs, NSDictFType, VK_LValue, > SourceLocation()); > > > > - MemberExpr *DictLiteralKeyME = new (Context) > > - MemberExpr(NSKeyCallExpr, false, SourceLocation(), ARRFD, > > - SourceLocation(), ARRFD->getType(), VK_LValue, > OK_Ordinary); > > + MemberExpr *DictLiteralKeyME = > > + MemberExpr::CreateImplicit(*Context, NSKeyCallExpr, false, ARRFD, > > + ARRFD->getType(), VK_LValue, > OK_Ordinary); > > > > CStyleCastExpr * DictKeyObjects = > > NoTypeInfoCStyleCastExpr(Context, > > @@ -3180,9 +3179,8 @@ Expr *RewriteModernObjC::SynthMsgSendStr > > returnType, nullptr, > > /*BitWidth=*/nullptr, > > /*Mutable=*/true, ICIS_NoInit); > > - MemberExpr *ME = new (Context) > > - MemberExpr(STCE, false, SourceLocation(), FieldD, > SourceLocation(), > > - FieldD->getType(), VK_LValue, OK_Ordinary); > > + MemberExpr *ME = MemberExpr::CreateImplicit( > > + *Context, STCE, false, FieldD, FieldD->getType(), VK_LValue, > OK_Ordinary); > > > > return ME; > > } > > @@ -4629,9 +4627,8 @@ Stmt *RewriteModernObjC::SynthesizeBlock > > Context->VoidPtrTy, nullptr, > > /*BitWidth=*/nullptr, > /*Mutable=*/true, > > ICIS_NoInit); > > - MemberExpr *ME = > > - new (Context) MemberExpr(PE, true, SourceLocation(), FD, > SourceLocation(), > > - FD->getType(), VK_LValue, OK_Ordinary); > > + MemberExpr *ME = MemberExpr::CreateImplicit( > > + *Context, PE, true, FD, FD->getType(), VK_LValue, OK_Ordinary); > > > > CastExpr *FunkCast = NoTypeInfoCStyleCastExpr(Context, > PtrToFuncCastType, > > CK_BitCast, ME); > > @@ -4676,9 +4673,8 @@ Stmt *RewriteModernObjC::RewriteBlockDec > > Context->VoidPtrTy, nullptr, > > /*BitWidth=*/nullptr, > /*Mutable=*/true, > > ICIS_NoInit); > > - MemberExpr *ME = new (Context) > > - MemberExpr(DeclRefExp, isArrow, SourceLocation(), FD, > SourceLocation(), > > - FD->getType(), VK_LValue, OK_Ordinary); > > + MemberExpr *ME = MemberExpr::CreateImplicit( > > + *Context, DeclRefExp, isArrow, FD, FD->getType(), VK_LValue, > OK_Ordinary); > > > > StringRef Name = VD->getName(); > > FD = FieldDecl::Create(*Context, nullptr, SourceLocation(), > SourceLocation(), > > @@ -4686,9 +4682,8 @@ Stmt *RewriteModernObjC::RewriteBlockDec > > Context->VoidPtrTy, nullptr, > > /*BitWidth=*/nullptr, /*Mutable=*/true, > > ICIS_NoInit); > > - ME = > > - new (Context) MemberExpr(ME, true, SourceLocation(), FD, > SourceLocation(), > > - DeclRefExp->getType(), VK_LValue, > OK_Ordinary); > > + ME = MemberExpr::CreateImplicit(*Context, ME, true, FD, > DeclRefExp->getType(), > > + VK_LValue, OK_Ordinary); > > > > // Need parens to enforce precedence. > > ParenExpr *PE = new (Context) ParenExpr(DeclRefExp->getExprLoc(), > > @@ -7528,9 +7523,8 @@ Stmt *RewriteModernObjC::RewriteObjCIvar > > IvarT, nullptr, > > /*BitWidth=*/nullptr, > > /*Mutable=*/true, > ICIS_NoInit); > > - MemberExpr *ME = new (Context) > > - MemberExpr(PE, true, SourceLocation(), FD, > SourceLocation(), > > - FD->getType(), VK_LValue, OK_Ordinary); > > + MemberExpr *ME = MemberExpr::CreateImplicit( > > + *Context, PE, true, FD, FD->getType(), VK_LValue, > OK_Ordinary); > > IvarT = Context->getDecltypeType(ME, ME->getType()); > > } > > } > > @@ -7557,9 +7551,9 @@ Stmt *RewriteModernObjC::RewriteObjCIvar > > D->getType(), nullptr, > > /*BitWidth=*/D->getBitWidth(), > > /*Mutable=*/true, ICIS_NoInit); > > - MemberExpr *ME = new (Context) > > - MemberExpr(PE, /*isArrow*/ false, SourceLocation(), FD, > > - SourceLocation(), FD->getType(), VK_LValue, > OK_Ordinary); > > + MemberExpr *ME = > > + MemberExpr::CreateImplicit(*Context, PE, /*isArrow*/ false, > FD, > > + FD->getType(), VK_LValue, > OK_Ordinary); > > Replacement = ME; > > > > } > > > > Modified: cfe/trunk/lib/Frontend/Rewrite/RewriteObjC.cpp > > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/Rewrite/RewriteObjC.cpp?rev=362551&r1=362550&r2=362551&view=diff > > > ============================================================================== > > --- cfe/trunk/lib/Frontend/Rewrite/RewriteObjC.cpp (original) > > +++ cfe/trunk/lib/Frontend/Rewrite/RewriteObjC.cpp Tue Jun 4 14:29:28 > 2019 > > @@ -3793,9 +3793,8 @@ Stmt *RewriteObjC::SynthesizeBlockCall(C > > Context->VoidPtrTy, nullptr, > > /*BitWidth=*/nullptr, > /*Mutable=*/true, > > ICIS_NoInit); > > - MemberExpr *ME = > > - new (Context) MemberExpr(PE, true, SourceLocation(), FD, > SourceLocation(), > > - FD->getType(), VK_LValue, OK_Ordinary); > > + MemberExpr *ME = MemberExpr::CreateImplicit( > > + *Context, PE, true, FD, FD->getType(), VK_LValue, OK_Ordinary); > > > > CastExpr *FunkCast = NoTypeInfoCStyleCastExpr(Context, > PtrToFuncCastType, > > CK_BitCast, ME); > > @@ -3840,9 +3839,9 @@ Stmt *RewriteObjC::RewriteBlockDeclRefEx > > Context->VoidPtrTy, nullptr, > > /*BitWidth=*/nullptr, > /*Mutable=*/true, > > ICIS_NoInit); > > - MemberExpr *ME = new (Context) > > - MemberExpr(DeclRefExp, isArrow, SourceLocation(), FD, > SourceLocation(), > > - FD->getType(), VK_LValue, OK_Ordinary); > > + MemberExpr *ME = > > + MemberExpr::CreateImplicit(*Context, DeclRefExp, isArrow, FD, > > + FD->getType(), VK_LValue, OK_Ordinary); > > > > StringRef Name = VD->getName(); > > FD = FieldDecl::Create(*Context, nullptr, SourceLocation(), > SourceLocation(), > > @@ -3850,9 +3849,8 @@ Stmt *RewriteObjC::RewriteBlockDeclRefEx > > Context->VoidPtrTy, nullptr, > > /*BitWidth=*/nullptr, /*Mutable=*/true, > > ICIS_NoInit); > > - ME = > > - new (Context) MemberExpr(ME, true, SourceLocation(), FD, > SourceLocation(), > > - DeclRefExp->getType(), VK_LValue, > OK_Ordinary); > > + ME = MemberExpr::CreateImplicit(*Context, ME, true, FD, > DeclRefExp->getType(), > > + VK_LValue, OK_Ordinary); > > > > // Need parens to enforce precedence. > > ParenExpr *PE = new (Context) ParenExpr(DeclRefExp->getExprLoc(), > > @@ -5830,10 +5828,10 @@ Stmt *RewriteObjCFragileABI::RewriteObjC > > OldRange.getEnd(), > > castExpr); > > if (IV->isFreeIvar() && > > - declaresSameEntity(CurMethodDef->getClassInterface(), > iFaceDecl->getDecl())) { > > - MemberExpr *ME = new (Context) > > - MemberExpr(PE, true, SourceLocation(), D, IV->getLocation(), > > - D->getType(), VK_LValue, OK_Ordinary); > > + declaresSameEntity(CurMethodDef->getClassInterface(), > > + iFaceDecl->getDecl())) { > > + MemberExpr *ME = MemberExpr::CreateImplicit( > > + *Context, PE, true, D, D->getType(), VK_LValue, > OK_Ordinary); > > Replacement = ME; > > } else { > > IV->setBase(PE); > > > > Modified: cfe/trunk/lib/Sema/SemaExprCXX.cpp > > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExprCXX.cpp?rev=362551&r1=362550&r2=362551&view=diff > > > ============================================================================== > > --- cfe/trunk/lib/Sema/SemaExprCXX.cpp (original) > > +++ cfe/trunk/lib/Sema/SemaExprCXX.cpp Tue Jun 4 14:29:28 2019 > > @@ -7189,9 +7189,12 @@ ExprResult Sema::BuildCXXMemberCallExpr( > > } > > } > > > > - MemberExpr *ME = new (Context) MemberExpr( > > - Exp.get(), /*IsArrow=*/false, SourceLocation(), Method, > SourceLocation(), > > - Context.BoundMemberTy, VK_RValue, OK_Ordinary); > > + MemberExpr *ME = MemberExpr::Create( > > + Context, Exp.get(), /*IsArrow=*/false, SourceLocation(), > > + NestedNameSpecifierLoc(), SourceLocation(), Method, > > + DeclAccessPair::make(FoundDecl, FoundDecl->getAccess()), > > + DeclarationNameInfo(), /*TemplateArgs=*/nullptr, > Context.BoundMemberTy, > > + VK_RValue, OK_Ordinary); > > if (HadMultipleCandidates) > > ME->setHadMultipleCandidates(true); > > MarkMemberReferenced(ME); > > > > Modified: cfe/trunk/lib/Serialization/ASTReaderStmt.cpp > > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTReaderStmt.cpp?rev=362551&r1=362550&r2=362551&view=diff > > > ============================================================================== > > --- cfe/trunk/lib/Serialization/ASTReaderStmt.cpp (original) > > +++ cfe/trunk/lib/Serialization/ASTReaderStmt.cpp Tue Jun 4 14:29:28 > 2019 > > @@ -752,9 +752,42 @@ void ASTStmtReader::VisitCXXMemberCallEx > > } > > > > void ASTStmtReader::VisitMemberExpr(MemberExpr *E) { > > - // Don't call VisitExpr, this is fully initialized at creation. > > - assert(E->getStmtClass() == Stmt::MemberExprClass && > > - "It's a subclass, we must advance Idx!"); > > + VisitExpr(E); > > + > > + bool HasQualifier = Record.readInt(); > > + bool HasFoundDecl = Record.readInt(); > > + bool HasTemplateInfo = Record.readInt(); > > + unsigned NumTemplateArgs = Record.readInt(); > > + > > + E->Base = Record.readSubExpr(); > > + E->MemberDecl = Record.readDeclAs<ValueDecl>(); > > + Record.readDeclarationNameLoc(E->MemberDNLoc, > E->MemberDecl->getDeclName()); > > + E->MemberLoc = Record.readSourceLocation(); > > + E->MemberExprBits.IsArrow = Record.readInt(); > > + E->MemberExprBits.HasQualifierOrFoundDecl = HasQualifier || > HasFoundDecl; > > + E->MemberExprBits.HasTemplateKWAndArgsInfo = HasTemplateInfo; > > + E->MemberExprBits.HadMultipleCandidates = Record.readInt(); > > + E->MemberExprBits.OperatorLoc = Record.readSourceLocation(); > > + > > + if (HasQualifier || HasFoundDecl) > > + *E->getTrailingObjects<MemberExprNameQualifier>() = > > + MemberExprNameQualifier(); > > + > > + if (HasFoundDecl) { > > + auto *FoundD = Record.readDeclAs<NamedDecl>(); > > + auto AS = (AccessSpecifier)Record.readInt(); > > + E->getTrailingObjects<MemberExprNameQualifier>()->FoundDecl = > > + DeclAccessPair::make(FoundD, AS); > > + } > > + > > + if (HasQualifier) > > + E->getTrailingObjects<MemberExprNameQualifier>()->QualifierLoc = > > + Record.readNestedNameSpecifierLoc(); > > + > > + if (HasTemplateInfo) > > + ReadTemplateKWAndArgsInfo( > > + *E->getTrailingObjects<ASTTemplateKWAndArgsInfo>(), > > + E->getTrailingObjects<TemplateArgumentLoc>(), NumTemplateArgs); > > } > > > > void ASTStmtReader::VisitObjCIsaExpr(ObjCIsaExpr *E) { > > @@ -2551,55 +2584,12 @@ Stmt *ASTReader::ReadStmtFromStream(Modu > > Context, /*NumArgs=*/Record[ASTStmtReader::NumExprFields], > Empty); > > break; > > > > - case EXPR_MEMBER: { > > - // We load everything here and fully initialize it at creation. > > - // That way we can use MemberExpr::Create and don't have to > duplicate its > > - // logic with a MemberExpr::CreateEmpty. > > - > > - assert(Record.getIdx() == 0); > > - NestedNameSpecifierLoc QualifierLoc; > > - if (Record.readInt()) { // HasQualifier. > > - QualifierLoc = Record.readNestedNameSpecifierLoc(); > > - } > > - > > - SourceLocation TemplateKWLoc; > > - TemplateArgumentListInfo ArgInfo; > > - bool HasTemplateKWAndArgsInfo = Record.readInt(); > > - if (HasTemplateKWAndArgsInfo) { > > - TemplateKWLoc = Record.readSourceLocation(); > > - unsigned NumTemplateArgs = Record.readInt(); > > - ArgInfo.setLAngleLoc(Record.readSourceLocation()); > > - ArgInfo.setRAngleLoc(Record.readSourceLocation()); > > - for (unsigned i = 0; i != NumTemplateArgs; ++i) > > - ArgInfo.addArgument(Record.readTemplateArgumentLoc()); > > - } > > - > > - bool HadMultipleCandidates = Record.readInt(); > > - > > - auto *FoundD = Record.readDeclAs<NamedDecl>(); > > - auto AS = (AccessSpecifier)Record.readInt(); > > - DeclAccessPair FoundDecl = DeclAccessPair::make(FoundD, AS); > > - > > - QualType T = Record.readType(); > > - auto VK = static_cast<ExprValueKind>(Record.readInt()); > > - auto OK = static_cast<ExprObjectKind>(Record.readInt()); > > - Expr *Base = ReadSubExpr(); > > - auto *MemberD = Record.readDeclAs<ValueDecl>(); > > - SourceLocation MemberLoc = Record.readSourceLocation(); > > - DeclarationNameInfo MemberNameInfo(MemberD->getDeclName(), > MemberLoc); > > - bool IsArrow = Record.readInt(); > > - SourceLocation OperatorLoc = Record.readSourceLocation(); > > - > > - S = MemberExpr::Create(Context, Base, IsArrow, OperatorLoc, > QualifierLoc, > > - TemplateKWLoc, MemberD, FoundDecl, > MemberNameInfo, > > - HasTemplateKWAndArgsInfo ? &ArgInfo : > nullptr, T, > > - VK, OK); > > - Record.readDeclarationNameLoc(cast<MemberExpr>(S)->MemberDNLoc, > > - MemberD->getDeclName()); > > - if (HadMultipleCandidates) > > - cast<MemberExpr>(S)->setHadMultipleCandidates(true); > > + case EXPR_MEMBER: > > + S = MemberExpr::CreateEmpty(Context, > Record[ASTStmtReader::NumExprFields], > > + Record[ASTStmtReader::NumExprFields + > 1], > > + Record[ASTStmtReader::NumExprFields + > 2], > > + Record[ASTStmtReader::NumExprFields + > 3]); > > break; > > - } > > > > case EXPR_BINARY_OPERATOR: > > S = new (Context) BinaryOperator(Empty); > > > > Modified: cfe/trunk/lib/Serialization/ASTWriterStmt.cpp > > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTWriterStmt.cpp?rev=362551&r1=362550&r2=362551&view=diff > > > ============================================================================== > > --- cfe/trunk/lib/Serialization/ASTWriterStmt.cpp (original) > > +++ cfe/trunk/lib/Serialization/ASTWriterStmt.cpp Tue Jun 4 14:29:28 > 2019 > > @@ -660,39 +660,45 @@ void ASTStmtWriter::VisitCallExpr(CallEx > > } > > > > void ASTStmtWriter::VisitMemberExpr(MemberExpr *E) { > > - // Don't call VisitExpr, we'll write everything here. > > + VisitExpr(E); > > > > - Record.push_back(E->hasQualifier()); > > - if (E->hasQualifier()) > > - Record.AddNestedNameSpecifierLoc(E->getQualifierLoc()); > > - > > - Record.push_back(E->hasTemplateKWAndArgsInfo()); > > - if (E->hasTemplateKWAndArgsInfo()) { > > - Record.AddSourceLocation(E->getTemplateKeywordLoc()); > > - unsigned NumTemplateArgs = E->getNumTemplateArgs(); > > - Record.push_back(NumTemplateArgs); > > - Record.AddSourceLocation(E->getLAngleLoc()); > > - Record.AddSourceLocation(E->getRAngleLoc()); > > - for (unsigned i=0; i != NumTemplateArgs; ++i) > > - Record.AddTemplateArgumentLoc(E->getTemplateArgs()[i]); > > - } > > - > > - Record.push_back(E->hadMultipleCandidates()); > > + bool HasQualifier = E->hasQualifier(); > > + bool HasFoundDecl = > > + E->hasQualifierOrFoundDecl() && > > + (E->getFoundDecl().getDecl() != E->getMemberDecl() || > > + E->getFoundDecl().getAccess() != > E->getMemberDecl()->getAccess()); > > + bool HasTemplateInfo = E->hasTemplateKWAndArgsInfo(); > > + unsigned NumTemplateArgs = E->getNumTemplateArgs(); > > + > > + // Write these first for easy access when deserializing, as they > affect the > > + // size of the MemberExpr. > > + Record.push_back(HasQualifier); > > + Record.push_back(HasFoundDecl); > > + Record.push_back(HasTemplateInfo); > > + Record.push_back(NumTemplateArgs); > > > > - DeclAccessPair FoundDecl = E->getFoundDecl(); > > - Record.AddDeclRef(FoundDecl.getDecl()); > > - Record.push_back(FoundDecl.getAccess()); > > - > > - Record.AddTypeRef(E->getType()); > > - Record.push_back(E->getValueKind()); > > - Record.push_back(E->getObjectKind()); > > Record.AddStmt(E->getBase()); > > Record.AddDeclRef(E->getMemberDecl()); > > + Record.AddDeclarationNameLoc(E->MemberDNLoc, > > + E->getMemberDecl()->getDeclName()); > > Record.AddSourceLocation(E->getMemberLoc()); > > Record.push_back(E->isArrow()); > > + Record.push_back(E->hadMultipleCandidates()); > > Record.AddSourceLocation(E->getOperatorLoc()); > > - Record.AddDeclarationNameLoc(E->MemberDNLoc, > > - E->getMemberDecl()->getDeclName()); > > + > > + if (HasFoundDecl) { > > + DeclAccessPair FoundDecl = E->getFoundDecl(); > > + Record.AddDeclRef(FoundDecl.getDecl()); > > + Record.push_back(FoundDecl.getAccess()); > > + } > > + > > + if (HasQualifier) > > + Record.AddNestedNameSpecifierLoc(E->getQualifierLoc()); > > + > > + if (HasTemplateInfo) > > + > AddTemplateKWAndArgsInfo(*E->getTrailingObjects<ASTTemplateKWAndArgsInfo>(), > > + > E->getTrailingObjects<TemplateArgumentLoc>()); > > + > > Code = serialization::EXPR_MEMBER; > > } > > > > > > > > _______________________________________________ > > cfe-commits mailing list > > cfe-commits@lists.llvm.org > > https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits > _______________________________________________ > cfe-commits mailing list > cfe-commits@lists.llvm.org > https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits >
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits