@@ -1712,21 +1712,42 @@ UnaryExprOrTypeTraitExpr::UnaryExprOrTypeTraitExpr(
1712
1712
}
1713
1713
1714
1714
MemberExpr::MemberExpr (Expr *Base, bool IsArrow, SourceLocation OperatorLoc,
1715
- ValueDecl *MemberDecl,
1716
- const DeclarationNameInfo &NameInfo, QualType T,
1715
+ NestedNameSpecifierLoc QualifierLoc,
1716
+ SourceLocation TemplateKWLoc, ValueDecl *MemberDecl,
1717
+ DeclAccessPair FoundDecl,
1718
+ const DeclarationNameInfo &NameInfo,
1719
+ const TemplateArgumentListInfo *TemplateArgs, QualType T,
1717
1720
ExprValueKind VK, ExprObjectKind OK,
1718
1721
NonOdrUseReason NOUR)
1719
1722
: Expr(MemberExprClass, T, VK, OK), Base(Base), MemberDecl(MemberDecl),
1720
1723
MemberDNLoc(NameInfo.getInfo()), MemberLoc(NameInfo.getLoc()) {
1721
1724
assert (!NameInfo.getName () ||
1722
1725
MemberDecl->getDeclName () == NameInfo.getName ());
1723
1726
MemberExprBits.IsArrow = IsArrow;
1724
- MemberExprBits.HasQualifier = false ;
1725
- MemberExprBits.HasFoundDecl = false ;
1726
- MemberExprBits.HasTemplateKWAndArgsInfo = false ;
1727
+ MemberExprBits.HasQualifier = QualifierLoc.hasQualifier ();
1728
+ MemberExprBits.HasFoundDecl =
1729
+ FoundDecl.getDecl () != MemberDecl ||
1730
+ FoundDecl.getAccess () != MemberDecl->getAccess ();
1731
+ MemberExprBits.HasTemplateKWAndArgsInfo =
1732
+ TemplateArgs || TemplateKWLoc.isValid ();
1727
1733
MemberExprBits.HadMultipleCandidates = false ;
1728
1734
MemberExprBits.NonOdrUseReason = NOUR;
1729
1735
MemberExprBits.OperatorLoc = OperatorLoc;
1736
+
1737
+ if (hasQualifier ())
1738
+ new (getTrailingObjects<NestedNameSpecifierLoc>())
1739
+ NestedNameSpecifierLoc (QualifierLoc);
1740
+ if (hasFoundDecl ())
1741
+ *getTrailingObjects<DeclAccessPair>() = FoundDecl;
1742
+ if (TemplateArgs) {
1743
+ auto Deps = TemplateArgumentDependence::None;
1744
+ getTrailingObjects<ASTTemplateKWAndArgsInfo>()->initializeFrom (
1745
+ TemplateKWLoc, *TemplateArgs, getTrailingObjects<TemplateArgumentLoc>(),
1746
+ Deps);
1747
+ } else if (TemplateKWLoc.isValid ()) {
1748
+ getTrailingObjects<ASTTemplateKWAndArgsInfo>()->initializeFrom (
1749
+ TemplateKWLoc);
1750
+ }
1730
1751
setDependence (computeDependence (this ));
1731
1752
}
1732
1753
@@ -1747,36 +1768,9 @@ MemberExpr *MemberExpr::Create(
1747
1768
TemplateArgs ? TemplateArgs->size () : 0 );
1748
1769
1749
1770
void *Mem = C.Allocate (Size , alignof (MemberExpr));
1750
- MemberExpr *E = new (Mem) MemberExpr (Base, IsArrow, OperatorLoc, MemberDecl,
1751
- NameInfo, T, VK, OK, NOUR);
1752
-
1753
- E->MemberExprBits .HasQualifier = HasQualifier;
1754
- E->MemberExprBits .HasFoundDecl = HasFoundDecl;
1755
- E->MemberExprBits .HasTemplateKWAndArgsInfo = HasTemplateKWAndArgsInfo;
1756
-
1757
- if (HasQualifier)
1758
- new (E->getTrailingObjects <NestedNameSpecifierLoc>())
1759
- NestedNameSpecifierLoc (QualifierLoc);
1760
- if (HasFoundDecl)
1761
- *E->getTrailingObjects <DeclAccessPair>() = FoundDecl;
1762
-
1763
- // FIXME: remove remaining dependence computation to computeDependence().
1764
- auto Deps = E->getDependence ();
1765
- if (TemplateArgs) {
1766
- auto TemplateArgDeps = TemplateArgumentDependence::None;
1767
- E->getTrailingObjects <ASTTemplateKWAndArgsInfo>()->initializeFrom (
1768
- TemplateKWLoc, *TemplateArgs,
1769
- E->getTrailingObjects <TemplateArgumentLoc>(), TemplateArgDeps);
1770
- for (const TemplateArgumentLoc &ArgLoc : TemplateArgs->arguments ()) {
1771
- Deps |= toExprDependence (ArgLoc.getArgument ().getDependence ());
1772
- }
1773
- } else if (TemplateKWLoc.isValid ()) {
1774
- E->getTrailingObjects <ASTTemplateKWAndArgsInfo>()->initializeFrom (
1775
- TemplateKWLoc);
1776
- }
1777
- E->setDependence (Deps);
1778
-
1779
- return E;
1771
+ return new (Mem) MemberExpr (Base, IsArrow, OperatorLoc, QualifierLoc,
1772
+ TemplateKWLoc, MemberDecl, FoundDecl, NameInfo,
1773
+ TemplateArgs, T, VK, OK, NOUR);
1780
1774
}
1781
1775
1782
1776
MemberExpr *MemberExpr::CreateEmpty (const ASTContext &Context,
0 commit comments