diff options
author | Krystian Stasiowski <sdkrystian@gmail.com> | 2024-07-11 18:49:35 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-07-11 18:49:35 -0400 |
commit | ce4aada6e2135e29839f672a6599db628b53295d (patch) | |
tree | d686b3d0c448339db2f1a7baf9ec51e953ad8a0c /clang/lib/Serialization/ASTWriterStmt.cpp | |
parent | ac304d5ffdea7676582e987f75caeba33355a5dd (diff) | |
download | llvm-ce4aada6e2135e29839f672a6599db628b53295d.zip llvm-ce4aada6e2135e29839f672a6599db628b53295d.tar.gz llvm-ce4aada6e2135e29839f672a6599db628b53295d.tar.bz2 |
Reapply "[Clang] Implement resolution for CWG1835 (#92957)" (#98547)
Reapplies #92957, fixing an instance where the `template` keyword was
missing prior to a dependent name in `llvm/ADT/ArrayRef.h`. An
_alias-declaration_ is used to work around a bug affecting GCC releases
before 11.1 (see https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94799) which
rejects the use of the `template` keyword prior to the
_nested-name-specifier_ in the class member access.
Diffstat (limited to 'clang/lib/Serialization/ASTWriterStmt.cpp')
-rw-r--r-- | clang/lib/Serialization/ASTWriterStmt.cpp | 43 |
1 files changed, 25 insertions, 18 deletions
diff --git a/clang/lib/Serialization/ASTWriterStmt.cpp b/clang/lib/Serialization/ASTWriterStmt.cpp index ea49901..30c5b1b 100644 --- a/clang/lib/Serialization/ASTWriterStmt.cpp +++ b/clang/lib/Serialization/ASTWriterStmt.cpp @@ -1988,34 +1988,41 @@ void ASTStmtWriter::VisitCXXDependentScopeMemberExpr( CXXDependentScopeMemberExpr *E) { VisitExpr(E); - // Don't emit anything here (or if you do you will have to update - // the corresponding deserialization function). - Record.push_back(E->getNumTemplateArgs()); - CurrentPackingBits.updateBits(); - CurrentPackingBits.addBit(E->hasTemplateKWAndArgsInfo()); - CurrentPackingBits.addBit(E->hasFirstQualifierFoundInScope()); - - if (E->hasTemplateKWAndArgsInfo()) { - const ASTTemplateKWAndArgsInfo &ArgInfo = - *E->getTrailingObjects<ASTTemplateKWAndArgsInfo>(); - AddTemplateKWAndArgsInfo(ArgInfo, - E->getTrailingObjects<TemplateArgumentLoc>()); - } + bool HasQualifier = E->hasQualifier(); + unsigned NumUnqualifiedLookups = E->getNumUnqualifiedLookups(); + bool HasTemplateInfo = E->hasTemplateKWAndArgsInfo(); + unsigned NumTemplateArgs = E->getNumTemplateArgs(); - CurrentPackingBits.addBit(E->isArrow()); + // Write these first for easy access when deserializing, as they affect the + // size of the CXXDependentScopeMemberExpr. + CurrentPackingBits.updateBits(); + CurrentPackingBits.addBit(HasQualifier); + CurrentPackingBits.addBit(HasTemplateInfo); + Record.push_back(NumUnqualifiedLookups); + Record.push_back(NumTemplateArgs); Record.AddTypeRef(E->getBaseType()); - Record.AddNestedNameSpecifierLoc(E->getQualifierLoc()); + CurrentPackingBits.addBit(E->isArrow()); CurrentPackingBits.addBit(!E->isImplicitAccess()); if (!E->isImplicitAccess()) Record.AddStmt(E->getBase()); Record.AddSourceLocation(E->getOperatorLoc()); - if (E->hasFirstQualifierFoundInScope()) - Record.AddDeclRef(E->getFirstQualifierFoundInScope()); - Record.AddDeclarationNameInfo(E->MemberNameInfo); + + if (HasQualifier) + Record.AddNestedNameSpecifierLoc(E->getQualifierLoc()); + + for (DeclAccessPair D : E->unqualified_lookups()) { + Record.AddDeclRef(D.getDecl()); + Record.push_back(D.getAccess()); + } + + if (HasTemplateInfo) + AddTemplateKWAndArgsInfo(*E->getTrailingObjects<ASTTemplateKWAndArgsInfo>(), + E->getTrailingObjects<TemplateArgumentLoc>()); + Code = serialization::EXPR_CXX_DEPENDENT_SCOPE_MEMBER; } |