diff options
author | Akira Hatanaka <ahatanaka@apple.com> | 2019-09-07 00:34:47 +0000 |
---|---|---|
committer | Akira Hatanaka <ahatanaka@apple.com> | 2019-09-07 00:34:47 +0000 |
commit | 3f2c9917a4310a2835ffcc5a7be6226d0d218682 (patch) | |
tree | 9bd9a1aa4ba312302ae9291f37809b9a9ac7b884 /clang/lib/AST/ASTContext.cpp | |
parent | 090510608da404a0e1c80fa29eb5fc18f2d91755 (diff) | |
download | bcm5719-llvm-3f2c9917a4310a2835ffcc5a7be6226d0d218682.tar.gz bcm5719-llvm-3f2c9917a4310a2835ffcc5a7be6226d0d218682.zip |
[Sema][ObjC] Mark C union fields that have non-trivial ObjC ownership
qualifications as unavailable if the union is declared in a system
header
r365985 stopped marking those fields as unavailable, which caused the
union's NonTrivialToPrimitive* bits to be set to true. This patch
restores the behavior prior to r365985, except that users can explicitly
specify the ownership qualification of the field to instruct the
compiler not to mark it as unavailable.
rdar://problem/53420753
Differential Revision: https://reviews.llvm.org/D65256
llvm-svn: 371276
Diffstat (limited to 'clang/lib/AST/ASTContext.cpp')
-rw-r--r-- | clang/lib/AST/ASTContext.cpp | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp index 94a5addff25..f488ef7995b 100644 --- a/clang/lib/AST/ASTContext.cpp +++ b/clang/lib/AST/ASTContext.cpp @@ -7949,6 +7949,28 @@ bool ASTContext::areCompatibleVectorTypes(QualType FirstVec, return false; } +bool ASTContext::hasDirectOwnershipQualifier(QualType Ty) const { + while (true) { + // __strong id + if (const AttributedType *Attr = dyn_cast<AttributedType>(Ty)) { + if (Attr->getAttrKind() == attr::ObjCOwnership) + return true; + + Ty = Attr->getModifiedType(); + + // X *__strong (...) + } else if (const ParenType *Paren = dyn_cast<ParenType>(Ty)) { + Ty = Paren->getInnerType(); + + // We do not want to look through typedefs, typeof(expr), + // typeof(type), or any other way that the type is somehow + // abstracted. + } else { + return false; + } + } +} + //===----------------------------------------------------------------------===// // ObjCQualifiedIdTypesAreCompatible - Compatibility testing for qualified id's. //===----------------------------------------------------------------------===// |