diff options
Diffstat (limited to 'clang/lib/AST/ASTContext.cpp')
-rw-r--r-- | clang/lib/AST/ASTContext.cpp | 17 |
1 files changed, 11 insertions, 6 deletions
diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp index fff714cb6aa..05f5f73504e 100644 --- a/clang/lib/AST/ASTContext.cpp +++ b/clang/lib/AST/ASTContext.cpp @@ -2642,7 +2642,8 @@ void ASTContext::adjustExceptionSpec( bool ASTContext::isParamDestroyedInCallee(QualType T) const { return getTargetInfo().getCXXABI().areArgsDestroyedLeftToRightInCallee() || - T.hasTrivialABIOverride(); + T.hasTrivialABIOverride() || + T.isDestructedType() == QualType::DK_nontrivial_c_struct; } /// getComplexType - Return the uniqued reference to the type for a complex @@ -5771,6 +5772,11 @@ bool ASTContext::BlockRequiresCopying(QualType Ty, return true; } + // The block needs copy/destroy helpers if Ty is non-trivial to destructively + // move or destroy. + if (Ty.isNonTrivialToPrimitiveDestructiveMove() || Ty.isDestructedType()) + return true; + if (!Ty->isObjCRetainableType()) return false; Qualifiers qs = Ty.getQualifiers(); @@ -5784,13 +5790,12 @@ bool ASTContext::BlockRequiresCopying(QualType Ty, case Qualifiers::OCL_ExplicitNone: case Qualifiers::OCL_Autoreleasing: return false; - - // Tell the runtime that this is ARC __weak, called by the - // byref routines. + + // These cases should have been taken care of when checking the type's + // non-triviality. case Qualifiers::OCL_Weak: - // ARC __strong __block variables need to be retained. case Qualifiers::OCL_Strong: - return true; + llvm_unreachable("impossible"); } llvm_unreachable("fell out of lifetime switch!"); } |