[ObjC++] Never pass structs that transitively contain __weak fields in
authorAkira Hatanaka <ahatanaka@apple.com>
Mon, 9 Apr 2018 20:39:47 +0000 (20:39 +0000)
committerAkira Hatanaka <ahatanaka@apple.com>
Mon, 9 Apr 2018 20:39:47 +0000 (20:39 +0000)
commitf15d29ccc7fa62b78c38d6ba2798da8646e4ca60
tree7a8fa782537a522b486d280f141bc8d9b4b9c126
parent47b2f9d836f8fbde3c70df18742270b36f5fe55d
[ObjC++] Never pass structs that transitively contain __weak fields in
registers.

This patch fixes a bug in r328731 that caused structs transitively
containing __weak fields to be passed in registers. The patch replaces
the flag RecordDecl::CanPassInRegisters with a 2-bit enum that indicates
whether the struct or structs containing the struct are forced to be
passed indirectly.

rdar://problem/39194693

llvm-svn: 329617
clang/include/clang/AST/Decl.h
clang/include/clang/AST/Type.h
clang/lib/AST/Decl.cpp
clang/lib/AST/DeclCXX.cpp
clang/lib/AST/Type.cpp
clang/lib/Sema/SemaDecl.cpp
clang/lib/Sema/SemaDeclCXX.cpp
clang/lib/Serialization/ASTReaderDecl.cpp
clang/lib/Serialization/ASTWriter.cpp
clang/lib/Serialization/ASTWriterDecl.cpp
clang/test/CodeGenObjCXX/objc-struct-cxx-abi.mm