@@ -1721,7 +1721,8 @@ MemberExpr::MemberExpr(Expr *Base, bool IsArrow, SourceLocation OperatorLoc,
1721
1721
assert (!NameInfo.getName () ||
1722
1722
MemberDecl->getDeclName () == NameInfo.getName ());
1723
1723
MemberExprBits.IsArrow = IsArrow;
1724
- MemberExprBits.HasQualifierOrFoundDecl = false ;
1724
+ MemberExprBits.HasQualifier = false ;
1725
+ MemberExprBits.HasFoundDecl = false ;
1725
1726
MemberExprBits.HasTemplateKWAndArgsInfo = false ;
1726
1727
MemberExprBits.HadMultipleCandidates = false ;
1727
1728
MemberExprBits.NonOdrUseReason = NOUR;
@@ -1735,30 +1736,29 @@ MemberExpr *MemberExpr::Create(
1735
1736
ValueDecl *MemberDecl, DeclAccessPair FoundDecl,
1736
1737
DeclarationNameInfo NameInfo, const TemplateArgumentListInfo *TemplateArgs,
1737
1738
QualType T, ExprValueKind VK, ExprObjectKind OK, NonOdrUseReason NOUR) {
1738
- bool HasQualOrFound = QualifierLoc || FoundDecl.getDecl () != MemberDecl ||
1739
- FoundDecl.getAccess () != MemberDecl->getAccess ();
1739
+ bool HasQualifier = QualifierLoc.hasQualifier ();
1740
+ bool HasFoundDecl = FoundDecl.getDecl () != MemberDecl ||
1741
+ FoundDecl.getAccess () != MemberDecl->getAccess ();
1740
1742
bool HasTemplateKWAndArgsInfo = TemplateArgs || TemplateKWLoc.isValid ();
1741
1743
std::size_t Size =
1742
- totalSizeToAlloc<MemberExprNameQualifier, ASTTemplateKWAndArgsInfo ,
1743
- TemplateArgumentLoc>(
1744
- HasQualOrFound ? 1 : 0 , HasTemplateKWAndArgsInfo ? 1 : 0 ,
1744
+ totalSizeToAlloc<NestedNameSpecifierLoc, DeclAccessPair ,
1745
+ ASTTemplateKWAndArgsInfo, TemplateArgumentLoc>(
1746
+ HasQualifier, HasFoundDecl , HasTemplateKWAndArgsInfo,
1745
1747
TemplateArgs ? TemplateArgs->size () : 0 );
1746
1748
1747
1749
void *Mem = C.Allocate (Size, alignof (MemberExpr));
1748
1750
MemberExpr *E = new (Mem) MemberExpr (Base, IsArrow, OperatorLoc, MemberDecl,
1749
1751
NameInfo, T, VK, OK, NOUR);
1750
1752
1751
- if (HasQualOrFound) {
1752
- E->MemberExprBits .HasQualifierOrFoundDecl = true ;
1753
-
1754
- MemberExprNameQualifier *NQ =
1755
- E->getTrailingObjects <MemberExprNameQualifier>();
1756
- NQ->QualifierLoc = QualifierLoc;
1757
- NQ->FoundDecl = FoundDecl;
1758
- }
1753
+ E->MemberExprBits .HasQualifier = HasQualifier;
1754
+ E->MemberExprBits .HasFoundDecl = HasFoundDecl;
1755
+ E->MemberExprBits .HasTemplateKWAndArgsInfo = HasTemplateKWAndArgsInfo;
1759
1756
1760
- E->MemberExprBits .HasTemplateKWAndArgsInfo =
1761
- TemplateArgs || TemplateKWLoc.isValid ();
1757
+ if (HasQualifier)
1758
+ new (E->getTrailingObjects <NestedNameSpecifierLoc>())
1759
+ NestedNameSpecifierLoc (QualifierLoc);
1760
+ if (HasFoundDecl)
1761
+ *E->getTrailingObjects <DeclAccessPair>() = FoundDecl;
1762
1762
1763
1763
// FIXME: remove remaining dependence computation to computeDependence().
1764
1764
auto Deps = E->getDependence ();
@@ -1785,12 +1785,11 @@ MemberExpr *MemberExpr::CreateEmpty(const ASTContext &Context,
1785
1785
unsigned NumTemplateArgs) {
1786
1786
assert ((!NumTemplateArgs || HasTemplateKWAndArgsInfo) &&
1787
1787
" template args but no template arg info?" );
1788
- bool HasQualOrFound = HasQualifier || HasFoundDecl;
1789
1788
std::size_t Size =
1790
- totalSizeToAlloc<MemberExprNameQualifier, ASTTemplateKWAndArgsInfo ,
1791
- TemplateArgumentLoc>(HasQualOrFound ? 1 : 0 ,
1792
- HasTemplateKWAndArgsInfo ? 1 : 0 ,
1793
- NumTemplateArgs);
1789
+ totalSizeToAlloc<NestedNameSpecifierLoc, DeclAccessPair ,
1790
+ ASTTemplateKWAndArgsInfo, TemplateArgumentLoc>(
1791
+ HasQualifier, HasFoundDecl, HasTemplateKWAndArgsInfo,
1792
+ NumTemplateArgs);
1794
1793
void *Mem = Context.Allocate (Size, alignof (MemberExpr));
1795
1794
return new (Mem) MemberExpr (EmptyShell ());
1796
1795
}
0 commit comments