yichi170 created this revision. Herald added a project: All. yichi170 requested review of this revision. Herald added a project: clang. Herald added a subscriber: cfe-commits.
Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D157201 Files: clang/include/clang/Sema/Sema.h clang/lib/Parse/ParseExpr.cpp clang/lib/Sema/SemaExpr.cpp Index: clang/lib/Sema/SemaExpr.cpp =================================================================== --- clang/lib/Sema/SemaExpr.cpp +++ clang/lib/Sema/SemaExpr.cpp @@ -16692,6 +16692,10 @@ if (!MemberDecl) { if ((IndirectMemberDecl = R.getAsSingle<IndirectFieldDecl>())) MemberDecl = IndirectMemberDecl->getAnonField(); + + IdentifierInfo *II = RD->getIdentifier(); + if (II == OC.U.IdentInfo && OC.isQualifier) + continue; } if (!MemberDecl) { Index: clang/lib/Parse/ParseExpr.cpp =================================================================== --- clang/lib/Parse/ParseExpr.cpp +++ clang/lib/Parse/ParseExpr.cpp @@ -2641,10 +2641,13 @@ // FIXME: This loop leaks the index expressions on error. while (true) { - if (Tok.is(tok::period)) { + if (Tok.is(tok::period) || Tok.is(tok::coloncolon)) { // offsetof-member-designator: offsetof-member-designator '.' identifier + if (Tok.is(tok::coloncolon)) + Comps.back().isQualifier = true; Comps.push_back(Sema::OffsetOfComponent()); Comps.back().isBrackets = false; + Comps.back().isQualifier = false; Comps.back().LocStart = ConsumeToken(); if (Tok.isNot(tok::identifier)) { @@ -2661,6 +2664,7 @@ // offsetof-member-designator: offsetof-member-design '[' expression ']' Comps.push_back(Sema::OffsetOfComponent()); Comps.back().isBrackets = true; + Comps.back().isQualifier = false; BalancedDelimiterTracker ST(*this, tok::l_square); ST.consumeOpen(); Comps.back().LocStart = ST.getOpenLocation(); Index: clang/include/clang/Sema/Sema.h =================================================================== --- clang/include/clang/Sema/Sema.h +++ clang/include/clang/Sema/Sema.h @@ -6036,6 +6036,7 @@ struct OffsetOfComponent { SourceLocation LocStart, LocEnd; bool isBrackets; // true if [expr], false if .ident + bool isQualifier; union { IdentifierInfo *IdentInfo; Expr *E;
Index: clang/lib/Sema/SemaExpr.cpp =================================================================== --- clang/lib/Sema/SemaExpr.cpp +++ clang/lib/Sema/SemaExpr.cpp @@ -16692,6 +16692,10 @@ if (!MemberDecl) { if ((IndirectMemberDecl = R.getAsSingle<IndirectFieldDecl>())) MemberDecl = IndirectMemberDecl->getAnonField(); + + IdentifierInfo *II = RD->getIdentifier(); + if (II == OC.U.IdentInfo && OC.isQualifier) + continue; } if (!MemberDecl) { Index: clang/lib/Parse/ParseExpr.cpp =================================================================== --- clang/lib/Parse/ParseExpr.cpp +++ clang/lib/Parse/ParseExpr.cpp @@ -2641,10 +2641,13 @@ // FIXME: This loop leaks the index expressions on error. while (true) { - if (Tok.is(tok::period)) { + if (Tok.is(tok::period) || Tok.is(tok::coloncolon)) { // offsetof-member-designator: offsetof-member-designator '.' identifier + if (Tok.is(tok::coloncolon)) + Comps.back().isQualifier = true; Comps.push_back(Sema::OffsetOfComponent()); Comps.back().isBrackets = false; + Comps.back().isQualifier = false; Comps.back().LocStart = ConsumeToken(); if (Tok.isNot(tok::identifier)) { @@ -2661,6 +2664,7 @@ // offsetof-member-designator: offsetof-member-design '[' expression ']' Comps.push_back(Sema::OffsetOfComponent()); Comps.back().isBrackets = true; + Comps.back().isQualifier = false; BalancedDelimiterTracker ST(*this, tok::l_square); ST.consumeOpen(); Comps.back().LocStart = ST.getOpenLocation(); Index: clang/include/clang/Sema/Sema.h =================================================================== --- clang/include/clang/Sema/Sema.h +++ clang/include/clang/Sema/Sema.h @@ -6036,6 +6036,7 @@ struct OffsetOfComponent { SourceLocation LocStart, LocEnd; bool isBrackets; // true if [expr], false if .ident + bool isQualifier; union { IdentifierInfo *IdentInfo; Expr *E;
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits