[ObjC] Allow declaring __weak pointer fields in C structs in ARC.
This patch uses the infrastructure added in r326307 for enabling
non-trivial fields to be declared in C structs to allow __weak fields in
C structs in ARC.
This recommits r327206, which was reverted because it caused
module-enabled builders to fail. I discovered that the
CXXRecordDecl::CanPassInRegisters flag wasn't being set correctly in
some cases after I moved it to RecordDecl.
Thanks to Eric Liu for helping me investigate the bug.
rdar://problem/33599681
https://reviews.llvm.org/D44095
llvm-svn: 327870
diff --git a/clang/include/clang/AST/Decl.h b/clang/include/clang/AST/Decl.h
index e141870..41b47ea 100644
--- a/clang/include/clang/AST/Decl.h
+++ b/clang/include/clang/AST/Decl.h
@@ -3553,6 +3553,12 @@
bool NonTrivialToPrimitiveCopy : 1;
bool NonTrivialToPrimitiveDestroy : 1;
+ /// True if this class can be passed in a non-address-preserving fashion
+ /// (such as in registers).
+ /// This does not imply anything about how the ABI in use will actually
+ /// pass an object of this class.
+ bool CanPassInRegisters : 1;
+
protected:
RecordDecl(Kind DK, TagKind TK, const ASTContext &C, DeclContext *DC,
SourceLocation StartLoc, SourceLocation IdLoc,
@@ -3636,6 +3642,18 @@
NonTrivialToPrimitiveDestroy = V;
}
+ /// Determine whether this class can be passed in registers. In C++ mode,
+ /// it must have at least one trivial, non-deleted copy or move constructor.
+ /// FIXME: This should be set as part of completeDefinition.
+ bool canPassInRegisters() const {
+ return CanPassInRegisters;
+ }
+
+ /// Set that we can pass this RecordDecl in registers.
+ void setCanPassInRegisters(bool CanPass) {
+ CanPassInRegisters = CanPass;
+ }
+
/// \brief Determines whether this declaration represents the
/// injected class name.
///