r299007 - Test Commit
Author: bkelley Date: Wed Mar 29 12:18:05 2017 New Revision: 299007 URL: http://llvm.org/viewvc/llvm-project?rev=299007&view=rev Log: Test Commit Remove trailing whitespace. Modified: cfe/trunk/lib/Sema/SemaDeclCXX.cpp Modified: cfe/trunk/lib/Sema/SemaDeclCXX.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclCXX.cpp?rev=299007&r1=299006&r2=299007&view=diff == --- cfe/trunk/lib/Sema/SemaDeclCXX.cpp (original) +++ cfe/trunk/lib/Sema/SemaDeclCXX.cpp Wed Mar 29 12:18:05 2017 @@ -12243,7 +12243,7 @@ void Sema::DefineImplicitLambdaToBlockPo // Set the body of the conversion function. Stmt *ReturnS = Return.get(); Conv->setBody(new (Context) CompoundStmt(Context, ReturnS, - Conv->getLocation(), + Conv->getLocation(), Conv->getLocation())); // We're done; notify the mutation listener, if any. ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
r299008 - [Objective-C] C++ Classes with __weak Members non-POD Types when using -fobjc-weak
Author: bkelley Date: Wed Mar 29 12:31:42 2017 New Revision: 299008 URL: http://llvm.org/viewvc/llvm-project?rev=299008&view=rev Log: [Objective-C] C++ Classes with __weak Members non-POD Types when using -fobjc-weak Summary: When adding an Objective-C retainable type member to a C++ class, also check the LangOpts.ObjCWeak flag and the lifetime qualifier so __weak qualified Objective-C pointer members cause the class to be a non-POD type with non-trivial special members, so the compiler always emits the necessary runtime calls for copying, moving, and destroying the weak member. Otherwise, Objective-C++ classes with weak Objective-C pointer members compiled with -fobjc-weak exhibit undefined behavior if the C++ class is classified as a POD type. Reviewers: rsmith, benlangmuir, doug.gregor, rjmccall Reviewed By: rjmccall Subscribers: cfe-commits Differential Revision: https://reviews.llvm.org/D31003 Added: cfe/trunk/test/CodeGenObjCXX/objc-weak.mm Modified: cfe/trunk/lib/AST/DeclCXX.cpp cfe/trunk/lib/Sema/SemaDeclCXX.cpp Modified: cfe/trunk/lib/AST/DeclCXX.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/DeclCXX.cpp?rev=299008&r1=299007&r2=299008&view=diff == --- cfe/trunk/lib/AST/DeclCXX.cpp (original) +++ cfe/trunk/lib/AST/DeclCXX.cpp Wed Mar 29 12:31:42 2017 @@ -722,9 +722,7 @@ void CXXRecordDecl::addedMember(Decl *D) ASTContext &Context = getASTContext(); QualType T = Context.getBaseElementType(Field->getType()); if (T->isObjCRetainableType() || T.isObjCGCStrong()) { - if (!Context.getLangOpts().ObjCAutoRefCount) { -setHasObjectMember(true); - } else if (T.getObjCLifetime() != Qualifiers::OCL_ExplicitNone) { + if (T.hasNonTrivialObjCLifetime()) { // Objective-C Automatic Reference Counting: // If a class has a non-static data member of Objective-C pointer // type (or array thereof), it is a non-POD type and its @@ -736,6 +734,8 @@ void CXXRecordDecl::addedMember(Decl *D) Data.PlainOldData = false; Data.HasTrivialSpecialMembers = 0; Data.HasIrrelevantDestructor = false; + } else if (!Context.getLangOpts().ObjCAutoRefCount) { +setHasObjectMember(true); } } else if (!T.isCXX98PODType(Context)) data().PlainOldData = false; Modified: cfe/trunk/lib/Sema/SemaDeclCXX.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclCXX.cpp?rev=299008&r1=299007&r2=299008&view=diff == --- cfe/trunk/lib/Sema/SemaDeclCXX.cpp (original) +++ cfe/trunk/lib/Sema/SemaDeclCXX.cpp Wed Mar 29 12:31:42 2017 @@ -4399,11 +4399,8 @@ BuildImplicitMemberInitializer(Sema &Sem } } - if (SemaRef.getLangOpts().ObjCAutoRefCount && - FieldBaseElementType->isObjCRetainableType() && - FieldBaseElementType.getObjCLifetime() != Qualifiers::OCL_None && - FieldBaseElementType.getObjCLifetime() != Qualifiers::OCL_ExplicitNone) { -// ARC: + if (FieldBaseElementType.hasNonTrivialObjCLifetime()) { +// ARC and Weak: // Default-initialize Objective-C pointers to NULL. CXXMemberInit = new (SemaRef.Context) CXXCtorInitializer(SemaRef.Context, Field, Added: cfe/trunk/test/CodeGenObjCXX/objc-weak.mm URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenObjCXX/objc-weak.mm?rev=299008&view=auto == --- cfe/trunk/test/CodeGenObjCXX/objc-weak.mm (added) +++ cfe/trunk/test/CodeGenObjCXX/objc-weak.mm Wed Mar 29 12:31:42 2017 @@ -0,0 +1,69 @@ +// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -emit-llvm -fblocks -fobjc-weak -fobjc-runtime-has-weak -std=c++11 -o - %s | FileCheck %s + +struct A { __weak id x; }; + +id test0() { + A a; + A b = a; + A c(static_cast(b)); + a = c; + c = static_cast(a); + return c.x; +} + +// Copy Assignment Operator +// CHECK-LABEL: define linkonce_odr dereferenceable({{[0-9]+}}) %struct.A* @_ZN1AaSERKS_( +// CHECK: [[THISADDR:%this.*]] = alloca [[A:.*]]* +// CHECK: [[OBJECTADDR:%.*]] = alloca [[A:.*]]* +// CHECK: [[THIS:%this.*]] = load [[A]]*, [[A]]** [[THISADDR]] +// CHECK: [[OBJECT:%.*]] = load [[A]]*, [[A]]** [[OBJECTADDR]] +// CHECK: [[T0:%.*]] = getelementptr inbounds [[A]], [[A]]* [[OBJECT]], i32 0, i32 0 +// CHECK-NEXT: [[T1:%.*]] = call i8* @objc_loadWeak(i8** [[T0]]) +// CHECK-NEXT: [[T2:%.*]] = getelementptr inbounds [[A]], [[A]]* [[THIS]], i32 0, i32 0 +// CHECK-NEXT: [[T3:%.*]] = call i8* @objc_storeWeak(i8** [[T2]], i8* [[T1]]) + +// Move Assignment Operator +// CHECK-LABEL: define linkonce_odr dereferenceable({{[0-9]+}}) %struct.A* @_ZN1AaSEOS_( +// CHECK: [[THISADDR:%this.*]] = alloca [[A:.*]]* +// CHECK: [[OBJECTADDR:%.*]] = alloca [[A:.*]]* +// CHECK: [[THIS:%this.*]] = load [[A]]*, [[A
r299010 - [Objective-C] Fix __weak type traits with -fobjc-weak
Author: bkelley Date: Wed Mar 29 12:40:35 2017 New Revision: 299010 URL: http://llvm.org/viewvc/llvm-project?rev=299010&view=rev Log: [Objective-C] Fix __weak type traits with -fobjc-weak Summary: Similar to ARC, in ObjCWeak Objective-C object pointers qualified with a weak lifetime are not POD or trivial types. Update the type trait code to reflect this. Copy and adapt the arc-type-traits.mm test case to verify correctness. Reviewers: rsmith, doug.gregor, rjmccall Reviewed By: rjmccall Subscribers: cfe-commits Differential Revision: https://reviews.llvm.org/D31004 Added: cfe/trunk/test/SemaObjCXX/objc-weak-type-traits.mm Modified: cfe/trunk/lib/AST/Type.cpp cfe/trunk/lib/Sema/SemaExprCXX.cpp Modified: cfe/trunk/lib/AST/Type.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/Type.cpp?rev=299010&r1=299009&r2=299010&view=diff == --- cfe/trunk/lib/AST/Type.cpp (original) +++ cfe/trunk/lib/AST/Type.cpp Wed Mar 29 12:40:35 2017 @@ -2023,20 +2023,8 @@ bool QualType::isCXX98PODType(const ASTC if ((*this)->isIncompleteType()) return false; - if (Context.getLangOpts().ObjCAutoRefCount) { -switch (getObjCLifetime()) { -case Qualifiers::OCL_ExplicitNone: - return true; - -case Qualifiers::OCL_Strong: -case Qualifiers::OCL_Weak: -case Qualifiers::OCL_Autoreleasing: - return false; - -case Qualifiers::OCL_None: - break; -} - } + if (hasNonTrivialObjCLifetime()) +return false; QualType CanonicalType = getTypePtr()->CanonicalType; switch (CanonicalType->getTypeClass()) { @@ -2085,22 +2073,8 @@ bool QualType::isTrivialType(const ASTCo if ((*this)->isIncompleteType()) return false; - if (Context.getLangOpts().ObjCAutoRefCount) { -switch (getObjCLifetime()) { -case Qualifiers::OCL_ExplicitNone: - return true; - -case Qualifiers::OCL_Strong: -case Qualifiers::OCL_Weak: -case Qualifiers::OCL_Autoreleasing: - return false; - -case Qualifiers::OCL_None: - if ((*this)->isObjCLifetimeType()) -return false; - break; -} - } + if (hasNonTrivialObjCLifetime()) +return false; QualType CanonicalType = getTypePtr()->CanonicalType; if (CanonicalType->isDependentType()) @@ -2137,22 +2111,8 @@ bool QualType::isTriviallyCopyableType(c if ((*this)->isArrayType()) return Context.getBaseElementType(*this).isTriviallyCopyableType(Context); - if (Context.getLangOpts().ObjCAutoRefCount) { -switch (getObjCLifetime()) { -case Qualifiers::OCL_ExplicitNone: - return true; - -case Qualifiers::OCL_Strong: -case Qualifiers::OCL_Weak: -case Qualifiers::OCL_Autoreleasing: - return false; - -case Qualifiers::OCL_None: - if ((*this)->isObjCLifetimeType()) -return false; - break; -} - } + if (hasNonTrivialObjCLifetime()) +return false; // C++11 [basic.types]p9 // Scalar types, trivially copyable class types, arrays of such types, and @@ -2298,20 +2258,8 @@ bool QualType::isCXX11PODType(const ASTC if (ty->isDependentType()) return false; - if (Context.getLangOpts().ObjCAutoRefCount) { -switch (getObjCLifetime()) { -case Qualifiers::OCL_ExplicitNone: - return true; - -case Qualifiers::OCL_Strong: -case Qualifiers::OCL_Weak: -case Qualifiers::OCL_Autoreleasing: - return false; - -case Qualifiers::OCL_None: - break; -} - } + if (hasNonTrivialObjCLifetime()) +return false; // C++11 [basic.types]p9: // Scalar types, POD classes, arrays of such types, and cv-qualified Modified: cfe/trunk/lib/Sema/SemaExprCXX.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExprCXX.cpp?rev=299010&r1=299009&r2=299010&view=diff == --- cfe/trunk/lib/Sema/SemaExprCXX.cpp (original) +++ cfe/trunk/lib/Sema/SemaExprCXX.cpp Wed Mar 29 12:40:35 2017 @@ -4518,25 +4518,6 @@ static bool EvaluateUnaryTypeTrait(Sema } } -/// \brief Determine whether T has a non-trivial Objective-C lifetime in -/// ARC mode. -static bool hasNontrivialObjCLifetime(QualType T) { - switch (T.getObjCLifetime()) { - case Qualifiers::OCL_ExplicitNone: -return false; - - case Qualifiers::OCL_Strong: - case Qualifiers::OCL_Weak: - case Qualifiers::OCL_Autoreleasing: -return true; - - case Qualifiers::OCL_None: -return T->isObjCLifetimeType(); - } - - llvm_unreachable("Unknown ObjC lifetime qualifier"); -} - static bool EvaluateBinaryTypeTrait(Sema &Self, TypeTrait BTT, QualType LhsT, QualType RhsT, SourceLocation KeyLoc); @@ -4630,10 +4611,9 @@ static bool evaluateTypeTrait(Sema &S, T return S.canThrow(Result.get()) == CT_Cannot; if (Kind == clang::TT_IsTriviallyConstru
r299011 - [Objective-C] Fix "repeated use of weak" warning with -fobjc-weak
Author: bkelley Date: Wed Mar 29 12:55:11 2017 New Revision: 299011 URL: http://llvm.org/viewvc/llvm-project?rev=299011&view=rev Log: [Objective-C] Fix "repeated use of weak" warning with -fobjc-weak Summary: -Warc-repeated-use-of-weak should produce the same warnings with -fobjc-weak as it does with -objc-arc. Also check for ObjCWeak along with ObjCAutoRefCount when recording the use of an evaluated weak variable. Add a -fobjc-weak run to the existing arc-repeated-weak test case and adapt it slightly to work in both modes. Reviewers: rsmith, doug.gregor, jordan_rose, rjmccall Reviewed By: rjmccall Subscribers: arphaman, rjmccall, cfe-commits Differential Revision: https://reviews.llvm.org/D31005 Modified: cfe/trunk/include/clang/AST/Type.h cfe/trunk/lib/AST/Type.cpp cfe/trunk/lib/Sema/SemaDecl.cpp cfe/trunk/lib/Sema/SemaExpr.cpp cfe/trunk/lib/Sema/SemaExprMember.cpp cfe/trunk/lib/Sema/SemaExprObjC.cpp cfe/trunk/lib/Sema/SemaPseudoObject.cpp cfe/trunk/test/SemaObjC/arc-repeated-weak.mm Modified: cfe/trunk/include/clang/AST/Type.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/Type.h?rev=299011&r1=299010&r2=299011&view=diff == --- cfe/trunk/include/clang/AST/Type.h (original) +++ cfe/trunk/include/clang/AST/Type.h Wed Mar 29 12:55:11 2017 @@ -1020,6 +1020,9 @@ public: return getQualifiers().hasStrongOrWeakObjCLifetime(); } + // true when Type is objc's weak and weak is enabled but ARC isn't. + bool isNonWeakInMRRWithObjCWeak(const ASTContext &Context) const; + enum DestructionKind { DK_none, DK_cxx_destructor, Modified: cfe/trunk/lib/AST/Type.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/Type.cpp?rev=299011&r1=299010&r2=299011&view=diff == --- cfe/trunk/lib/AST/Type.cpp (original) +++ cfe/trunk/lib/AST/Type.cpp Wed Mar 29 12:55:11 2017 @@ -2148,7 +2148,11 @@ bool QualType::isTriviallyCopyableType(c return false; } - +bool QualType::isNonWeakInMRRWithObjCWeak(const ASTContext &Context) const { + return !Context.getLangOpts().ObjCAutoRefCount && + Context.getLangOpts().ObjCWeak && + getObjCLifetime() != Qualifiers::OCL_Weak; +} bool Type::isLiteralType(const ASTContext &Ctx) const { if (isDependentType()) Modified: cfe/trunk/lib/Sema/SemaDecl.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDecl.cpp?rev=299011&r1=299010&r2=299011&view=diff == --- cfe/trunk/lib/Sema/SemaDecl.cpp (original) +++ cfe/trunk/lib/Sema/SemaDecl.cpp Wed Mar 29 12:55:11 2017 @@ -10167,7 +10167,8 @@ void Sema::AddInitializerToDecl(Decl *Re // we do not warn to warn spuriously when 'x' and 'y' are on separate // paths through the function. This should be revisited if // -Wrepeated-use-of-weak is made flow-sensitive. -if (VDecl->getType().getObjCLifetime() == Qualifiers::OCL_Strong && +if ((VDecl->getType().getObjCLifetime() == Qualifiers::OCL_Strong || + VDecl->getType().isNonWeakInMRRWithObjCWeak(Context)) && !Diags.isIgnored(diag::warn_arc_repeated_use_of_weak, Init->getLocStart())) getCurFunction()->markSafeWeakUse(Init); Modified: cfe/trunk/lib/Sema/SemaExpr.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExpr.cpp?rev=299011&r1=299010&r2=299011&view=diff == --- cfe/trunk/lib/Sema/SemaExpr.cpp (original) +++ cfe/trunk/lib/Sema/SemaExpr.cpp Wed Mar 29 12:55:11 2017 @@ -704,8 +704,7 @@ ExprResult Sema::DefaultLvalueConversion // Loading a __weak object implicitly retains the value, so we need a cleanup to // balance that. - if (getLangOpts().ObjCAutoRefCount && - E->getType().getObjCLifetime() == Qualifiers::OCL_Weak) + if (E->getType().getObjCLifetime() == Qualifiers::OCL_Weak) Cleanup.setExprNeedsCleanups(true); ExprResult Res = ImplicitCastExpr::Create(Context, T, CK_LValueToRValue, E, @@ -2509,11 +2508,11 @@ Sema::LookupInObjCMethod(LookupResult &L ObjCIvarRefExpr(IV, IV->getUsageType(SelfExpr.get()->getType()), Loc, IV->getLocation(), SelfExpr.get(), true, true); + if (IV->getType().getObjCLifetime() == Qualifiers::OCL_Weak) { +if (!Diags.isIgnored(diag::warn_arc_repeated_use_of_weak, Loc)) + recordUseOfEvaluatedWeak(Result); + } if (getLangOpts().ObjCAutoRefCount) { -if (IV->getType().getObjCLifetime() == Qualifiers::OCL_Weak) { - if (!Diags.isIgnored(diag::warn_arc_repeated_use_of_weak, Loc)) -recordUseOfEvaluatedWeak(Result); -} if (CurContext->isClosure()) Diag(Loc, diag::warn_implicitly_retains_self) << FixI
r299014 - [Objective-C] Fix "weak-unavailable" warning with -fobjc-weak
Author: bkelley Date: Wed Mar 29 13:09:02 2017 New Revision: 299014 URL: http://llvm.org/viewvc/llvm-project?rev=299014&view=rev Log: [Objective-C] Fix "weak-unavailable" warning with -fobjc-weak Summary: clang should produce the same errors Objective-C classes that cannot be assigned to weak pointers under both -fobjc-arc and -fobjc-weak. Check for ObjCWeak along with ObjCAutoRefCount when analyzing pointer conversions. Add an -fobjc-weak pass to the existing arc-unavailable-for-weakref test cases to verify the behavior is the same. Reviewers: rsmith, doug.gregor, rjmccall Reviewed By: rjmccall Subscribers: cfe-commits Differential Revision: https://reviews.llvm.org/D31006 Modified: cfe/trunk/include/clang/Basic/LangOptions.h cfe/trunk/include/clang/Sema/Sema.h cfe/trunk/lib/Sema/SemaCast.cpp cfe/trunk/lib/Sema/SemaExpr.cpp cfe/trunk/lib/Sema/SemaExprCXX.cpp cfe/trunk/lib/Sema/SemaExprObjC.cpp cfe/trunk/lib/Sema/SemaPseudoObject.cpp cfe/trunk/test/SemaObjC/arc-unavailable-for-weakref.m cfe/trunk/test/SemaObjCXX/arc-unavailable-for-weakref.mm Modified: cfe/trunk/include/clang/Basic/LangOptions.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/LangOptions.h?rev=299014&r1=299013&r2=299014&view=diff == --- cfe/trunk/include/clang/Basic/LangOptions.h (original) +++ cfe/trunk/include/clang/Basic/LangOptions.h Wed Mar 29 13:09:02 2017 @@ -170,6 +170,11 @@ public: /// \brief Is this a libc/libm function that is no longer recognized as a /// builtin because a -fno-builtin-* option has been specified? bool isNoBuiltinFunc(StringRef Name) const; + + /// \brief True if any ObjC types may have non-trivial lifetime qualifiers. + bool allowsNonTrivialObjCLifetimeQualifiers() const { +return ObjCAutoRefCount || ObjCWeak; + } }; /// \brief Floating point control options Modified: cfe/trunk/include/clang/Sema/Sema.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Sema/Sema.h?rev=299014&r1=299013&r2=299014&view=diff == --- cfe/trunk/include/clang/Sema/Sema.h (original) +++ cfe/trunk/include/clang/Sema/Sema.h Wed Mar 29 13:09:02 2017 @@ -9346,14 +9346,14 @@ public: enum ARCConversionResult { ACR_okay, ACR_unbridged, ACR_error }; /// \brief Checks for invalid conversions and casts between - /// retainable pointers and other pointer kinds. - ARCConversionResult CheckObjCARCConversion(SourceRange castRange, - QualType castType, Expr *&op, - CheckedConversionKind CCK, - bool Diagnose = true, - bool DiagnoseCFAudited = false, - BinaryOperatorKind Opc = BO_PtrMemD - ); + /// retainable pointers and other pointer kinds for ARC and Weak. + ARCConversionResult CheckObjCConversion(SourceRange castRange, + QualType castType, Expr *&op, + CheckedConversionKind CCK, + bool Diagnose = true, + bool DiagnoseCFAudited = false, + BinaryOperatorKind Opc = BO_PtrMemD + ); Expr *stripARCUnbridgedCast(Expr *e); void diagnoseARCUnbridgedCast(Expr *e); Modified: cfe/trunk/lib/Sema/SemaCast.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaCast.cpp?rev=299014&r1=299013&r2=299014&view=diff == --- cfe/trunk/lib/Sema/SemaCast.cpp (original) +++ cfe/trunk/lib/Sema/SemaCast.cpp Wed Mar 29 13:09:02 2017 @@ -120,12 +120,12 @@ namespace { Self.CheckCastAlign(SrcExpr.get(), DestType, OpRange); } -void checkObjCARCConversion(Sema::CheckedConversionKind CCK) { - assert(Self.getLangOpts().ObjCAutoRefCount); +void checkObjCConversion(Sema::CheckedConversionKind CCK) { + assert(Self.getLangOpts().allowsNonTrivialObjCLifetimeQualifiers()); Expr *src = SrcExpr.get(); - if (Self.CheckObjCARCConversion(OpRange, DestType, src, CCK) == -Sema::ACR_unbridged) + if (Self.CheckObjCConversion(OpRange, DestType, src, CCK) == + Sema::ACR_unbridged) IsARCUnbridgedCast = true; SrcExpr = src; } @@ -872,7 +872,7 @@ void CastOperation::CheckReinterpretCast SrcExpr = ExprError(); } else if (tcr == TC_Success) { if (Self.getLangOpts().ObjCAutoRefCount) - checkObjCARCConversion(Sema::CCK_OtherCast); + checkObjCConversion(Sema::CCK_OtherCast); DiagnoseReinterpretUpDownCast(Self, SrcExpr.get(),
r299015 - [Objective-C] Miscellaneous -fobjc-weak Fixes
Author: bkelley Date: Wed Mar 29 13:16:38 2017 New Revision: 299015 URL: http://llvm.org/viewvc/llvm-project?rev=299015&view=rev Log: [Objective-C] Miscellaneous -fobjc-weak Fixes Summary: After examining the remaining uses of LangOptions.ObjCAutoRefCount, found a some additional places to also check for ObjCWeak not covered by previous test cases. Added a test file to verify all the code paths that were changed. Reviewers: rsmith, doug.gregor, rjmccall Reviewed By: rjmccall Subscribers: cfe-commits Differential Revision: https://reviews.llvm.org/D31007 Added: cfe/trunk/test/SemaObjCXX/objc-weak.mm Modified: cfe/trunk/lib/Sema/SemaCast.cpp cfe/trunk/lib/Sema/SemaDecl.cpp cfe/trunk/lib/Sema/SemaDeclCXX.cpp cfe/trunk/lib/Sema/SemaInit.cpp Modified: cfe/trunk/lib/Sema/SemaCast.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaCast.cpp?rev=299015&r1=299014&r2=299015&view=diff == --- cfe/trunk/lib/Sema/SemaCast.cpp (original) +++ cfe/trunk/lib/Sema/SemaCast.cpp Wed Mar 29 13:16:38 2017 @@ -871,7 +871,7 @@ void CastOperation::CheckReinterpretCast } SrcExpr = ExprError(); } else if (tcr == TC_Success) { -if (Self.getLangOpts().ObjCAutoRefCount) +if (Self.getLangOpts().allowsNonTrivialObjCLifetimeQualifiers()) checkObjCConversion(Sema::CCK_OtherCast); DiagnoseReinterpretUpDownCast(Self, SrcExpr.get(), DestType, OpRange); } @@ -935,7 +935,7 @@ void CastOperation::CheckStaticCast() { } else if (tcr == TC_Success) { if (Kind == CK_BitCast) checkCastAlign(); -if (Self.getLangOpts().ObjCAutoRefCount) +if (Self.getLangOpts().allowsNonTrivialObjCLifetimeQualifiers()) checkObjCConversion(Sema::CCK_OtherCast); } else if (Kind == CK_BitCast) { checkCastAlign(); Modified: cfe/trunk/lib/Sema/SemaDecl.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDecl.cpp?rev=299015&r1=299014&r2=299015&view=diff == --- cfe/trunk/lib/Sema/SemaDecl.cpp (original) +++ cfe/trunk/lib/Sema/SemaDecl.cpp Wed Mar 29 13:16:38 2017 @@ -14468,7 +14468,7 @@ void Sema::ActOnFields(Scope *S, SourceL // Verify that all the fields are okay. SmallVector RecFields; - bool ARCErrReported = false; + bool ObjCFieldLifetimeErrReported = false; for (ArrayRef::iterator i = Fields.begin(), end = Fields.end(); i != end; ++i) { FieldDecl *FD = cast(*i); @@ -14603,16 +14603,16 @@ void Sema::ActOnFields(Scope *S, SourceL << FixItHint::CreateInsertion(FD->getLocation(), "*"); QualType T = Context.getObjCObjectPointerType(FD->getType()); FD->setType(T); -} else if (getLangOpts().ObjCAutoRefCount && Record && !ARCErrReported && +} else if (getLangOpts().allowsNonTrivialObjCLifetimeQualifiers() && + Record && !ObjCFieldLifetimeErrReported && (!getLangOpts().CPlusPlus || Record->isUnion())) { - // It's an error in ARC if a field has lifetime. + // It's an error in ARC or Weak if a field has lifetime. // We don't want to report this in a system header, though, // so we just make the field unavailable. // FIXME: that's really not sufficient; we need to make the type // itself invalid to, say, initialize or copy. QualType T = FD->getType(); - Qualifiers::ObjCLifetime lifetime = T.getObjCLifetime(); - if (lifetime && lifetime != Qualifiers::OCL_ExplicitNone) { + if (T.hasNonTrivialObjCLifetime()) { SourceLocation loc = FD->getLocation(); if (getSourceManager().isInSystemHeader(loc)) { if (!FD->hasAttr()) { @@ -14623,7 +14623,7 @@ void Sema::ActOnFields(Scope *S, SourceL Diag(FD->getLocation(), diag::err_arc_objc_object_in_tag) << T->isBlockPointerType() << Record->getTagKind(); } -ARCErrReported = true; +ObjCFieldLifetimeErrReported = true; } } else if (getLangOpts().ObjC1 && getLangOpts().getGC() != LangOptions::NonGC && Modified: cfe/trunk/lib/Sema/SemaDeclCXX.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclCXX.cpp?rev=299015&r1=299014&r2=299015&view=diff == --- cfe/trunk/lib/Sema/SemaDeclCXX.cpp (original) +++ cfe/trunk/lib/Sema/SemaDeclCXX.cpp Wed Mar 29 13:16:38 2017 @@ -7145,8 +7145,7 @@ static bool checkTrivialClassMembers(Sem // [...] nontrivally ownership-qualified types are [...] not trivially // default constructible, copy constructible, move constructible, copy // assignable, move assignable, or destructible [...] -if (S.getLangOpts().ObjCAutoRefCount && -FieldType.hasNonTrivialObjCLifetime()) { +if (FieldType.hasNonTrivialObjCLifetime()) { if (Diagnose) S.Diag(FI->getLocatio