diff options
Diffstat (limited to 'clang/lib/AST')
-rw-r--r-- | clang/lib/AST/ASTImporter.cpp | 1 | ||||
-rw-r--r-- | clang/lib/AST/Decl.cpp | 3 | ||||
-rw-r--r-- | clang/lib/AST/DeclCXX.cpp | 1 | ||||
-rw-r--r-- | clang/lib/AST/Type.cpp | 32 |
4 files changed, 27 insertions, 10 deletions
diff --git a/clang/lib/AST/ASTImporter.cpp b/clang/lib/AST/ASTImporter.cpp index ac262e70629..6b9260d2d87 100644 --- a/clang/lib/AST/ASTImporter.cpp +++ b/clang/lib/AST/ASTImporter.cpp @@ -1105,7 +1105,6 @@ bool ASTNodeImporter::ImportDefinition(RecordDecl *From, RecordDecl *To, = FromData.HasConstexprNonCopyMoveConstructor; ToData.HasDefaultedDefaultConstructor = FromData.HasDefaultedDefaultConstructor; - ToData.CanPassInRegisters = FromData.CanPassInRegisters; ToData.DefaultedDefaultConstructorIsConstexpr = FromData.DefaultedDefaultConstructorIsConstexpr; ToData.HasConstexprDefaultConstructor diff --git a/clang/lib/AST/Decl.cpp b/clang/lib/AST/Decl.cpp index b640dccbd85..35364d6abcb 100644 --- a/clang/lib/AST/Decl.cpp +++ b/clang/lib/AST/Decl.cpp @@ -3931,7 +3931,8 @@ RecordDecl::RecordDecl(Kind DK, TagKind TK, const ASTContext &C, HasObjectMember(false), HasVolatileMember(false), LoadedFieldsFromExternalStorage(false), NonTrivialToPrimitiveDefaultInitialize(false), - NonTrivialToPrimitiveCopy(false), NonTrivialToPrimitiveDestroy(false) { + NonTrivialToPrimitiveCopy(false), NonTrivialToPrimitiveDestroy(false), + CanPassInRegisters(true) { assert(classof(static_cast<Decl*>(this)) && "Invalid Kind!"); } diff --git a/clang/lib/AST/DeclCXX.cpp b/clang/lib/AST/DeclCXX.cpp index 487386fdb5d..271872352cd 100644 --- a/clang/lib/AST/DeclCXX.cpp +++ b/clang/lib/AST/DeclCXX.cpp @@ -93,7 +93,6 @@ CXXRecordDecl::DefinitionData::DefinitionData(CXXRecordDecl *D) DeclaredNonTrivialSpecialMembersForCall(0), HasIrrelevantDestructor(true), HasConstexprNonCopyMoveConstructor(false), HasDefaultedDefaultConstructor(false), - CanPassInRegisters(true), DefaultedDefaultConstructorIsConstexpr(true), HasConstexprDefaultConstructor(false), HasNonLiteralTypeFieldsOrBases(false), ComputedVisibleConversions(false), diff --git a/clang/lib/AST/Type.cpp b/clang/lib/AST/Type.cpp index 99f5b1384ad..2985aac66b2 100644 --- a/clang/lib/AST/Type.cpp +++ b/clang/lib/AST/Type.cpp @@ -2214,11 +2214,14 @@ QualType::isNonTrivialToPrimitiveDefaultInitialize() const { if (RT->getDecl()->isNonTrivialToPrimitiveDefaultInitialize()) return PDIK_Struct; - Qualifiers::ObjCLifetime Lifetime = getQualifiers().getObjCLifetime(); - if (Lifetime == Qualifiers::OCL_Strong) + switch (getQualifiers().getObjCLifetime()) { + case Qualifiers::OCL_Strong: return PDIK_ARCStrong; - - return PDIK_Trivial; + case Qualifiers::OCL_Weak: + return PDIK_ARCWeak; + default: + return PDIK_Trivial; + } } QualType::PrimitiveCopyKind QualType::isNonTrivialToPrimitiveCopy() const { @@ -2228,10 +2231,14 @@ QualType::PrimitiveCopyKind QualType::isNonTrivialToPrimitiveCopy() const { return PCK_Struct; Qualifiers Qs = getQualifiers(); - if (Qs.getObjCLifetime() == Qualifiers::OCL_Strong) + switch (Qs.getObjCLifetime()) { + case Qualifiers::OCL_Strong: return PCK_ARCStrong; - - return Qs.hasVolatile() ? PCK_VolatileTrivial : PCK_Trivial; + case Qualifiers::OCL_Weak: + return PCK_ARCWeak; + default: + return Qs.hasVolatile() ? PCK_VolatileTrivial : PCK_Trivial; + } } QualType::PrimitiveCopyKind @@ -2239,6 +2246,17 @@ QualType::isNonTrivialToPrimitiveDestructiveMove() const { return isNonTrivialToPrimitiveCopy(); } +bool QualType::canPassInRegisters() const { + if (const auto *RT = + getTypePtr()->getBaseElementTypeUnsafe()->getAs<RecordType>()) + return RT->getDecl()->canPassInRegisters(); + + if (getQualifiers().getObjCLifetime() == Qualifiers::OCL_Weak) + return false; + + return true; +} + bool Type::isLiteralType(const ASTContext &Ctx) const { if (isDependentType()) return false; |