diff options
author | John McCall <rjmccall@apple.com> | 2017-08-15 21:42:47 +0000 |
---|---|---|
committer | John McCall <rjmccall@apple.com> | 2017-08-15 21:42:47 +0000 |
commit | f1ef796fd9f1fb4412698acffb649d5fa1d55b18 (patch) | |
tree | 809b07139f2f4c711728c5bfac5ae8dd475f96de /clang/lib/AST/Expr.cpp | |
parent | 477b123ead3f9044fa98d2173b69e57a39ec3823 (diff) | |
download | bcm5719-llvm-f1ef796fd9f1fb4412698acffb649d5fa1d55b18.tar.gz bcm5719-llvm-f1ef796fd9f1fb4412698acffb649d5fa1d55b18.zip |
Allow the target field of a CK_ToUnion to be more easily recovered.
llvm-svn: 310963
Diffstat (limited to 'clang/lib/AST/Expr.cpp')
-rw-r--r-- | clang/lib/AST/Expr.cpp | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/clang/lib/AST/Expr.cpp b/clang/lib/AST/Expr.cpp index 7dc14183513..7c62ccf052c 100644 --- a/clang/lib/AST/Expr.cpp +++ b/clang/lib/AST/Expr.cpp @@ -1695,6 +1695,26 @@ CXXBaseSpecifier **CastExpr::path_buffer() { } } +const FieldDecl *CastExpr::getTargetFieldForToUnionCast(QualType unionType, + QualType opType) { + auto RD = unionType->castAs<RecordType>()->getDecl(); + return getTargetFieldForToUnionCast(RD, opType); +} + +const FieldDecl *CastExpr::getTargetFieldForToUnionCast(const RecordDecl *RD, + QualType OpType) { + auto &Ctx = RD->getASTContext(); + RecordDecl::field_iterator Field, FieldEnd; + for (Field = RD->field_begin(), FieldEnd = RD->field_end(); + Field != FieldEnd; ++Field) { + if (Ctx.hasSameUnqualifiedType(Field->getType(), OpType) && + !Field->isUnnamedBitfield()) { + return *Field; + } + } + return nullptr; +} + ImplicitCastExpr *ImplicitCastExpr::Create(const ASTContext &C, QualType T, CastKind Kind, Expr *Operand, const CXXCastPath *BasePath, |