diff options
author | Richard Smith <richard-llvm@metafoo.co.uk> | 2019-06-11 17:50:36 +0000 |
---|---|---|
committer | Richard Smith <richard-llvm@metafoo.co.uk> | 2019-06-11 17:50:36 +0000 |
commit | 1bbad59379c44cc46c7e99710e9a4730eed4ff75 (patch) | |
tree | d28ff007280e26e33e315e30a99a8901d3a8e81c /clang/lib/AST | |
parent | 715f7a1bd058c64a39cc4773114dfb46ae8cc8a3 (diff) | |
download | bcm5719-llvm-1bbad59379c44cc46c7e99710e9a4730eed4ff75.tar.gz bcm5719-llvm-1bbad59379c44cc46c7e99710e9a4730eed4ff75.zip |
For DR712: store on a MemberExpr whether it constitutes an odr-use.
llvm-svn: 363087
Diffstat (limited to 'clang/lib/AST')
-rw-r--r-- | clang/lib/AST/ASTImporter.cpp | 9 | ||||
-rw-r--r-- | clang/lib/AST/Expr.cpp | 10 | ||||
-rw-r--r-- | clang/lib/AST/JSONNodeDumper.cpp | 6 | ||||
-rw-r--r-- | clang/lib/AST/TextNodeDumper.cpp | 6 |
4 files changed, 23 insertions, 8 deletions
diff --git a/clang/lib/AST/ASTImporter.cpp b/clang/lib/AST/ASTImporter.cpp index c4ae3b80b96..14bccd77115 100644 --- a/clang/lib/AST/ASTImporter.cpp +++ b/clang/lib/AST/ASTImporter.cpp @@ -7113,10 +7113,11 @@ ExpectedStmt ASTNodeImporter::VisitMemberExpr(MemberExpr *E) { ResInfo = &ToTAInfo; } - return MemberExpr::Create( - Importer.getToContext(), ToBase, E->isArrow(), ToOperatorLoc, - ToQualifierLoc, ToTemplateKeywordLoc, ToMemberDecl, ToFoundDecl, - ToMemberNameInfo, ResInfo, ToType, E->getValueKind(), E->getObjectKind()); + return MemberExpr::Create(Importer.getToContext(), ToBase, E->isArrow(), + ToOperatorLoc, ToQualifierLoc, ToTemplateKeywordLoc, + ToMemberDecl, ToFoundDecl, ToMemberNameInfo, + ResInfo, ToType, E->getValueKind(), + E->getObjectKind(), E->isNonOdrUse()); } ExpectedStmt diff --git a/clang/lib/AST/Expr.cpp b/clang/lib/AST/Expr.cpp index b772518fc70..77d444151c3 100644 --- a/clang/lib/AST/Expr.cpp +++ b/clang/lib/AST/Expr.cpp @@ -1541,7 +1541,8 @@ UnaryExprOrTypeTraitExpr::UnaryExprOrTypeTraitExpr( MemberExpr::MemberExpr(Expr *Base, bool IsArrow, SourceLocation OperatorLoc, ValueDecl *MemberDecl, const DeclarationNameInfo &NameInfo, QualType T, - ExprValueKind VK, ExprObjectKind OK) + ExprValueKind VK, ExprObjectKind OK, + NonOdrUseReason NOUR) : Expr(MemberExprClass, T, VK, OK, Base->isTypeDependent(), Base->isValueDependent(), Base->isInstantiationDependent(), Base->containsUnexpandedParameterPack()), @@ -1553,6 +1554,7 @@ MemberExpr::MemberExpr(Expr *Base, bool IsArrow, SourceLocation OperatorLoc, MemberExprBits.HasQualifierOrFoundDecl = false; MemberExprBits.HasTemplateKWAndArgsInfo = false; MemberExprBits.HadMultipleCandidates = false; + MemberExprBits.NonOdrUseReason = NOUR; MemberExprBits.OperatorLoc = OperatorLoc; } @@ -1561,7 +1563,7 @@ MemberExpr *MemberExpr::Create( NestedNameSpecifierLoc QualifierLoc, SourceLocation TemplateKWLoc, ValueDecl *MemberDecl, DeclAccessPair FoundDecl, DeclarationNameInfo NameInfo, const TemplateArgumentListInfo *TemplateArgs, - QualType T, ExprValueKind VK, ExprObjectKind OK) { + QualType T, ExprValueKind VK, ExprObjectKind OK, NonOdrUseReason NOUR) { bool HasQualOrFound = QualifierLoc || FoundDecl.getDecl() != MemberDecl || FoundDecl.getAccess() != MemberDecl->getAccess(); bool HasTemplateKWAndArgsInfo = TemplateArgs || TemplateKWLoc.isValid(); @@ -1572,8 +1574,8 @@ MemberExpr *MemberExpr::Create( TemplateArgs ? TemplateArgs->size() : 0); void *Mem = C.Allocate(Size, alignof(MemberExpr)); - MemberExpr *E = new (Mem) - MemberExpr(Base, IsArrow, OperatorLoc, MemberDecl, NameInfo, T, VK, OK); + MemberExpr *E = new (Mem) MemberExpr(Base, IsArrow, OperatorLoc, MemberDecl, + NameInfo, T, VK, OK, NOUR); if (HasQualOrFound) { // FIXME: Wrong. We should be looking at the member declaration we found. diff --git a/clang/lib/AST/JSONNodeDumper.cpp b/clang/lib/AST/JSONNodeDumper.cpp index 1290847e1aa..2527df66f2c 100644 --- a/clang/lib/AST/JSONNodeDumper.cpp +++ b/clang/lib/AST/JSONNodeDumper.cpp @@ -843,6 +843,12 @@ void JSONNodeDumper::VisitMemberExpr(const MemberExpr *ME) { JOS.attribute("name", VD && VD->getDeclName() ? VD->getNameAsString() : ""); JOS.attribute("isArrow", ME->isArrow()); JOS.attribute("referencedMemberDecl", createPointerRepresentation(VD)); + switch (ME->isNonOdrUse()) { + case NOUR_None: break; + case NOUR_Unevaluated: JOS.attribute("nonOdrUseReason", "unevaluated"); break; + case NOUR_Constant: JOS.attribute("nonOdrUseReason", "constant"); break; + case NOUR_Discarded: JOS.attribute("nonOdrUseReason", "discarded"); break; + } } void JSONNodeDumper::VisitCXXNewExpr(const CXXNewExpr *NE) { diff --git a/clang/lib/AST/TextNodeDumper.cpp b/clang/lib/AST/TextNodeDumper.cpp index 3b8c8f22c37..06388c28d96 100644 --- a/clang/lib/AST/TextNodeDumper.cpp +++ b/clang/lib/AST/TextNodeDumper.cpp @@ -825,6 +825,12 @@ void TextNodeDumper::VisitUnaryExprOrTypeTraitExpr( void TextNodeDumper::VisitMemberExpr(const MemberExpr *Node) { OS << " " << (Node->isArrow() ? "->" : ".") << *Node->getMemberDecl(); dumpPointer(Node->getMemberDecl()); + switch (Node->isNonOdrUse()) { + case NOUR_None: break; + case NOUR_Unevaluated: OS << " non_odr_use_unevaluated"; break; + case NOUR_Constant: OS << " non_odr_use_constant"; break; + case NOUR_Discarded: OS << " non_odr_use_discarded"; break; + } } void TextNodeDumper::VisitExtVectorElementExpr( |