]> granicus.if.org Git - clang/commitdiff
[ARC] Ignore qualifiers in copy-restore expressions
authorVedant Kumar <vsk@apple.com>
Mon, 3 Oct 2016 15:29:22 +0000 (15:29 +0000)
committerVedant Kumar <vsk@apple.com>
Mon, 3 Oct 2016 15:29:22 +0000 (15:29 +0000)
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.

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

lib/CodeGen/CGCall.cpp
test/CodeGenObjC/unqual-copy-restore.m [new file with mode: 0644]

index 233f6c17d485fea5e672cb7706d55f331a350362..2c40854bbb6bdfc6463192626cd87c4386cdf61c 100644 (file)
@@ -3269,7 +3269,7 @@ void CodeGenFunction::EmitCallArg(CallArgList &args, const Expr *E,
   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);
   }
 
diff --git a/test/CodeGenObjC/unqual-copy-restore.m b/test/CodeGenObjC/unqual-copy-restore.m
new file mode 100644 (file)
index 0000000..09915f7
--- /dev/null
@@ -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.
+@protocol P1
+@end
+
+typedef int handler(id<P1> *const p);
+
+int main() {
+  id<P1> i1 = 0;
+  handler *func = 0;
+  return func(&i1);
+}