@@ -1761,14 +1761,19 @@ UnaryExprOrTypeTraitExpr::UnaryExprOrTypeTraitExpr(
17611761 setDependence (computeDependence (this ));
17621762}
17631763
1764+ bool MemberExpr::needsDeclTypeStorage (ValueDecl *VD, QualType DeclType) {
1765+ return !DeclType.isNull () &&
1766+ (DeclType != VD->getType () || VD->getType ()->isUndeducedType ());
1767+ }
1768+
17641769MemberExpr::MemberExpr (Expr *Base, bool IsArrow, SourceLocation OperatorLoc,
17651770 NestedNameSpecifierLoc QualifierLoc,
17661771 SourceLocation TemplateKWLoc, ValueDecl *MemberDecl,
17671772 DeclAccessPair FoundDecl,
17681773 const DeclarationNameInfo &NameInfo,
17691774 const TemplateArgumentListInfo *TemplateArgs,
17701775 const TemplateArgumentList *Deduced, QualType T,
1771- ExprValueKind VK, ExprObjectKind OK,
1776+ ExprValueKind VK, QualType DeclType, ExprObjectKind OK,
17721777 NonOdrUseReason NOUR)
17731778 : Expr(MemberExprClass, T, VK, OK), Base(Base), MemberDecl(MemberDecl),
17741779 Deduced(Deduced), MemberDNLoc(NameInfo.getInfo()),
@@ -1784,6 +1789,8 @@ MemberExpr::MemberExpr(Expr *Base, bool IsArrow, SourceLocation OperatorLoc,
17841789 TemplateArgs || TemplateKWLoc.isValid ();
17851790 MemberExprBits.HadMultipleCandidates = false ;
17861791 MemberExprBits.NonOdrUseReason = NOUR;
1792+ MemberExprBits.HasResugaredDeclType =
1793+ needsDeclTypeStorage (MemberDecl, DeclType);
17871794 MemberExprBits.OperatorLoc = OperatorLoc;
17881795
17891796 if (hasQualifier ())
@@ -1800,6 +1807,12 @@ MemberExpr::MemberExpr(Expr *Base, bool IsArrow, SourceLocation OperatorLoc,
18001807 getTrailingObjects<ASTTemplateKWAndArgsInfo>()->initializeFrom (
18011808 TemplateKWLoc);
18021809 }
1810+ if (HasResugaredDeclType ()) {
1811+ assert (DeclType.getCanonicalType () ==
1812+ MemberDecl->getType ().getCanonicalType ());
1813+ *getTrailingObjects<QualType>() =
1814+ DeclType.isNull () ? MemberDecl->getType () : DeclType;
1815+ }
18031816 setDependence (computeDependence (this ));
18041817}
18051818
@@ -1809,45 +1822,60 @@ MemberExpr *MemberExpr::Create(
18091822 ValueDecl *MemberDecl, DeclAccessPair FoundDecl,
18101823 DeclarationNameInfo NameInfo, const TemplateArgumentListInfo *TemplateArgs,
18111824 const TemplateArgumentList *Deduced, QualType T, ExprValueKind VK,
1812- ExprObjectKind OK, NonOdrUseReason NOUR) {
1825+ QualType DeclType, ExprObjectKind OK, NonOdrUseReason NOUR) {
18131826 bool HasQualifier = QualifierLoc.hasQualifier ();
18141827 bool HasFoundDecl = FoundDecl.getDecl () != MemberDecl ||
18151828 FoundDecl.getAccess () != MemberDecl->getAccess ();
18161829 bool HasTemplateKWAndArgsInfo = TemplateArgs || TemplateKWLoc.isValid ();
18171830 std::size_t Size =
18181831 totalSizeToAlloc<NestedNameSpecifierLoc, DeclAccessPair,
1819- ASTTemplateKWAndArgsInfo, TemplateArgumentLoc>(
1832+ ASTTemplateKWAndArgsInfo, TemplateArgumentLoc, QualType >(
18201833 HasQualifier, HasFoundDecl, HasTemplateKWAndArgsInfo,
1821- TemplateArgs ? TemplateArgs->size () : 0 );
1834+ TemplateArgs ? TemplateArgs->size () : 0 ,
1835+ needsDeclTypeStorage (MemberDecl, DeclType) ? 1 : 0 );
18221836
18231837 void *Mem = C.Allocate (Size, alignof (MemberExpr));
18241838 return new (Mem) MemberExpr (Base, IsArrow, OperatorLoc, QualifierLoc,
18251839 TemplateKWLoc, MemberDecl, FoundDecl, NameInfo,
1826- TemplateArgs, Deduced, T, VK, OK, NOUR);
1840+ TemplateArgs, Deduced, T, VK, DeclType, OK, NOUR);
18271841}
18281842
18291843MemberExpr *MemberExpr::CreateEmpty (const ASTContext &Context,
18301844 bool HasQualifier, bool HasFoundDecl,
18311845 bool HasTemplateKWAndArgsInfo,
1832- unsigned NumTemplateArgs) {
1846+ unsigned NumTemplateArgs,
1847+ bool HasResugaredDeclType) {
18331848 assert ((!NumTemplateArgs || HasTemplateKWAndArgsInfo) &&
18341849 " template args but no template arg info?" );
18351850 std::size_t Size =
18361851 totalSizeToAlloc<NestedNameSpecifierLoc, DeclAccessPair,
1837- ASTTemplateKWAndArgsInfo, TemplateArgumentLoc>(
1838- HasQualifier, HasFoundDecl, HasTemplateKWAndArgsInfo,
1839- NumTemplateArgs );
1852+ ASTTemplateKWAndArgsInfo, TemplateArgumentLoc, QualType >(
1853+ HasQualifier, HasFoundDecl, HasTemplateKWAndArgsInfo, NumTemplateArgs,
1854+ HasResugaredDeclType );
18401855 void *Mem = Context.Allocate (Size, alignof (MemberExpr));
18411856 return new (Mem) MemberExpr (EmptyShell ());
18421857}
18431858
18441859void MemberExpr::setMemberDecl (ValueDecl *NewD) {
1860+ assert (MemberDecl != NewD);
1861+ assert (declaresSameEntity (MemberDecl, NewD));
1862+ assert (!HasResugaredDeclType () ||
1863+ MemberDecl->getASTContext ().hasSameType (
1864+ NewD->getType (), *getTrailingObjects<QualType>()));
18451865 MemberDecl = NewD;
1846- if (getType ()->isUndeducedType ())
1847- setType (NewD->getType ());
1866+ recomputeDependency ();
1867+ }
1868+
1869+ void MemberExpr::recomputeDependency () {
18481870 setDependence (computeDependence (this ));
18491871}
18501872
1873+ void MemberExpr::setDeclType (QualType T) {
1874+ assert (!T.isNull ());
1875+ if (HasResugaredDeclType ())
1876+ *getTrailingObjects<QualType>() = T;
1877+ }
1878+
18511879SourceLocation MemberExpr::getBeginLoc () const {
18521880 if (isImplicitAccess ()) {
18531881 if (hasQualifier ())
0 commit comments