r283116 - [ARC] Ignore qualifiers in copy-restore expressions

Vedant Kumar via cfe-commits cfe-commits at lists.llvm.org
Mon Oct 3 08:29:22 PDT 2016


Author: vedantk
Date: Mon Oct  3 10:29:22 2016
New Revision: 283116

URL: http://llvm.org/viewvc/llvm-project?rev=283116&view=rev
Log:
[ARC] Ignore qualifiers in copy-restore expressions

When ARC is enabled, an ObjCIndirectCopyRestoreExpr models the passing
of a function argument s.t:

  * The argument is copied into a temporary,
  * The temporary is passed into the function, and
  * After the function call completes, the temporary is move-assigned
    back to the original location of the argument.

The argument type and the parameter type must agree "except possibly in
qualification". This commit weakens an assertion in EmitCallArg() to
actually reflect that.

Added:
    cfe/trunk/test/CodeGenObjC/unqual-copy-restore.m
Modified:
    cfe/trunk/lib/CodeGen/CGCall.cpp

Modified: cfe/trunk/lib/CodeGen/CGCall.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGCall.cpp?rev=283116&r1=283115&r2=283116&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CGCall.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGCall.cpp Mon Oct  3 10:29:22 2016
@@ -3269,7 +3269,7 @@ void CodeGenFunction::EmitCallArg(CallAr
   if (const ObjCIndirectCopyRestoreExpr *CRE
         = dyn_cast<ObjCIndirectCopyRestoreExpr>(E)) {
     assert(getLangOpts().ObjCAutoRefCount);
-    assert(getContext().hasSameType(E->getType(), type));
+    assert(getContext().hasSameUnqualifiedType(E->getType(), type));
     return emitWritebackArg(*this, args, CRE);
   }
 

Added: cfe/trunk/test/CodeGenObjC/unqual-copy-restore.m
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenObjC/unqual-copy-restore.m?rev=283116&view=auto
==============================================================================
--- cfe/trunk/test/CodeGenObjC/unqual-copy-restore.m (added)
+++ cfe/trunk/test/CodeGenObjC/unqual-copy-restore.m Mon Oct  3 10:29:22 2016
@@ -0,0 +1,14 @@
+// RUN: %clang_cc1 %s -fobjc-arc -S -emit-llvm -o /dev/null
+
+// rdar://problem/28488427 - Don't crash if the argument type and the parameter
+// type in an indirect copy restore expression have different qualification.
+ at protocol P1
+ at end
+
+typedef int handler(id<P1> *const p);
+
+int main() {
+  id<P1> i1 = 0;
+  handler *func = 0;
+  return func(&i1);
+}




More information about the cfe-commits mailing list