r299007 - Test Commit

2017-03-29 Thread Brian Kelley via cfe-commits
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

2017-03-29 Thread Brian Kelley via cfe-commits
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

2017-03-29 Thread Brian Kelley via cfe-commits
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

2017-03-29 Thread Brian Kelley via cfe-commits
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

2017-03-29 Thread Brian Kelley via cfe-commits
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

2017-03-29 Thread Brian Kelley via cfe-commits
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