]> granicus.if.org Git - clang/commitdiff
objc: issue error if assigning objects in fragile-abi too.
authorFariborz Jahanian <fjahanian@apple.com>
Tue, 24 Jan 2012 18:05:45 +0000 (18:05 +0000)
committerFariborz Jahanian <fjahanian@apple.com>
Tue, 24 Jan 2012 18:05:45 +0000 (18:05 +0000)
// rdar://10731065

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@148823 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Basic/DiagnosticSemaKinds.td
lib/Sema/SemaExpr.cpp
test/SemaObjCXX/fragile-abi-object-assign.m [new file with mode: 0644]

index 6c2c4ef5589507e9864861b8f242ab5954072938..311d9985759c1fca463ccc3c30048d33c17a0023 100644 (file)
@@ -3608,6 +3608,8 @@ def warn_pointer_indirection_from_incompatible_type : Warning<
 
 def err_assignment_requires_nonfragile_object : Error<
   "cannot assign to class object in non-fragile ABI (%0 invalid)">;
+def err_objc_object_assignment : Error<
+  "cannot assign to class object - use memcpy instead">;
 def err_direct_interface_unsupported : Error<
   "indirection to an interface is not supported (%0 invalid)">;
 def err_typecheck_invalid_operands : Error<
index 2d32ea9a066bc98f1e7a306a404f8ace45ab516e..9adf22ad2da78103675c4896ed370085d761e8cf 100644 (file)
@@ -7252,10 +7252,14 @@ QualType Sema::CheckAssignmentOperands(Expr *LHSExpr, ExprResult &RHS,
       ConvTy = Compatible;
 
     if (ConvTy == Compatible &&
-        getLangOptions().ObjCNonFragileABI &&
-        LHSType->isObjCObjectType())
-      Diag(Loc, diag::err_assignment_requires_nonfragile_object)
-        << LHSType;
+        LHSType->isObjCObjectType()) {
+      if (getLangOptions().ObjCNonFragileABI)
+        Diag(Loc, diag::err_assignment_requires_nonfragile_object)
+          << LHSType;
+      else
+        Diag(Loc, diag::err_objc_object_assignment)
+          << LHSType;
+    }
 
     // If the RHS is a unary plus or minus, check to see if they = and + are
     // right next to each other.  If so, the user may have typo'd "x =+ 4"
diff --git a/test/SemaObjCXX/fragile-abi-object-assign.m b/test/SemaObjCXX/fragile-abi-object-assign.m
new file mode 100644 (file)
index 0000000..41f961d
--- /dev/null
@@ -0,0 +1,13 @@
+// RUN: %clang_cc1 -triple x86_64-apple-darwin11 -fsyntax-only -fobjc-fragile-abi -verify %s
+// rdar://10731065
+
+@interface MyView {}
+@end
+
+@implementation MyViewTemplate // expected-warning {{cannot find interface declaration for 'MyViewTemplate'}}
+- (id) createRealObject {
+  id realObj;
+  *(MyView *) realObj = *(MyView *) self; // expected-error {{cannot assign to class object - use memcpy instead}}
+}
+@end
+