r362551 - Convert MemberExpr creation and serialization to work the same way as

Richard Smith via cfe-commits cfe-commits at lists.llvm.org
Wed Jun 5 09:12:10 PDT 2019


On Wed, 5 Jun 2019, 04:44 Benjamin Kramer via cfe-commits, <
cfe-commits at lists.llvm.org> wrote:

> It also crashes during clang selfhost with modules and libc++. Let me know
> if you need a precise reproducer command.
>

Yes, please.

I reverted this change and the dependent r362563 in r362597.
>

Thanks!

On Wed, Jun 5, 2019 at 9:37 AM Martin Storsjö via cfe-commits <
> cfe-commits at 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 at lists.llvm.org
>> > https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>> _______________________________________________
>> cfe-commits mailing list
>> cfe-commits at lists.llvm.org
>> https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commitsYes,
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20190605/d81053a7/attachment-0001.html>


More information about the cfe-commits mailing list